Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么.NET货币格式包含货币符号?_.net_Localization_Currency - Fatal编程技术网

为什么.NET货币格式包含货币符号?

为什么.NET货币格式包含货币符号?,.net,localization,currency,.net,Localization,Currency,这段代码:Console.Out.WriteLine(string.Format(CultureInfo.GetCultureInfo(“hu-hu”),“{0:C}”,1234.56M))将生成以下输出:1234,56英尺,这在技术上是正确的,但如何猜测货币呢 这种行为意味着简单地将显示文化从hu-hu更改为en-US,将使该值乘以200以上,具体取决于当前的费率。你决不会错开500福林而不是500美元的账单。显而易见 设置货币的唯一“好”方法是克隆所需的区域性并设置货币符号: var for

这段代码:
Console.Out.WriteLine(string.Format(CultureInfo.GetCultureInfo(“hu-hu”),“{0:C}”,1234.56M))
将生成以下输出:1234,56英尺,这在技术上是正确的,但如何猜测货币呢

这种行为意味着简单地将显示文化从hu-hu更改为en-US,将使该值乘以200以上,具体取决于当前的费率。你决不会错开500福林而不是500美元的账单。显而易见

设置货币的唯一“好”方法是克隆所需的区域性并设置货币符号:

var format = NumberFormatInfo.GetInstance(CultureInfo.GetCultureInfo("en-US")).Clone() as NumberFormatInfo;
format.CurrencySymbol = "asd";
Console.Out.WriteLine(string.Format(format, "{0:C}", 1234.56M));
这可以正确地生成
asd1234.56
,但是非常麻烦

我的问题是:

  • 在这个我们已经生活了几十年的全球世界中,违约与国家货币的比率是多少
  • 为什么没有办法以更相关的方式指定金额和货币,因为它们是如此耦合
  • 奖励:如果我使用sk作为文化,我会得到欧元作为“默认”货币。如果我改为Framework2.0,我应该得到
    Sk
    (斯洛伐克克朗),因为2005年它是国家货币。(好吧,这不会发生。但我没有在任何不晚于2.0的系统上尝试过。)
  • 更新: 结论:

  • 从文化中默认货币对某些人来说是正常的,对其他人(包括我)来说是奇怪的
  • 没有“金额”类型,因为没有长度、重量等类型,限制在哪里?Virtlink为此创建了一个库:

  • 我不知道.NET,但是您的格式化程序允许您在格式字符串中省略“M”吗


    因此:
    1234.56
    而不是这个
    1234.56M

    我说不出设计师的想法,但他们的决定对我来说很有意义。回答您的问题:

  • 我们大多数人和我们的客户都使用单一货币,这取决于我们居住的国家。默认为该文化的默认货币是有意义的
  • 货币符号和数字格式是单独设置的,因为在更改货币符号时,很可能希望保留默认的数字格式。例如,如果我(在美国)以英镑打印一个金额,我不希望数字格式改变——只希望货币符号改变。如果我必须同时设置它们,我不仅要知道新的货币符号,还要知道我使用的具体数字格式。此外,如果它们组合在一起,那么更改数字格式(对于非货币值)也需要我指定货币符号。除非你有两种完全不同的数字格式。。。这太疯狂了
  • 在那个问题上没有答案

  • 简言之,有两个独立的设置可以让您更灵活,让事情更简单。将事物结合起来会使更多的工作单独改变事物。

    我改变了主意:我同意你的观点,货币是文化的一部分,这很奇怪

    在.NET和Java中,用值指定单位并不常见。您通常不使用单位指定温度、距离或货币。对于大多数意图和目的,单位由开发商假设:距离为米,温度为摄氏度。对于给定的区域性,.NET中没有指定默认的距离单位或温度单位

    为了保持一致,.NET Framework也不应该向区域性中添加货币信息。大多数人使用不止一种货币,有些国家甚至接受多种货币。不是每个特定文化的人都会使用一种且仅使用一种货币

    .NET framework包含一个
    System.Currency
    类,但它是隐藏的(内部),仅用于
    Decimal.ToOACurrency()
    方法。它也不是很有用。自2002年以来,Java包含一个
    Currency
    类,但由于.NET Framework是在2000年创建的,许多设计错误都是从Java复制过来的,这可能是其中之一。但是,我找不到关于Java
    Locale
    类是否包含(或包含)任何货币信息的信息,我也不是通灵者

    那么,从.NET中从未指定单位的观点出发,一种文化不应该有默认的货币,那么他们应该把货币价值的货币单位放在哪里呢?当然,他们应该创建一个
    Currency


    快速搜索并没有打开任何货币库,因此作为一个实验,我创建了一个用于处理货币(包括货币单位)的便携式库。它工作得出奇地好

    你可以在这里下载:

    -用于处理货币和货币的便携式.NET库


    如果有人有任何建议或改进,请执行拉取请求或创建问题。

    我只是认为,当应用程序中可能出现多种货币时,不应使用此选项。如果您有一个简单的应用程序,它可以像处理数字一样处理金钱,而数字必须以当地货币进行解释,那么它可能会很有用

    在所有其他情况下,不要使用它


    我不认为有很多这样的应用程序是有意义的。

    为什么.NET货币格式包含货币符号


    因为它是一种货币格式

    文字类型对格式没有影响。我试过使用不同的类型(M、D、甚至L)。
    M
    只是声明一个十进制常量,而不是双精度常量。我不认为小数的格式不同。明白了。这只是一个想法。包含M非常重要,否则您将从绝对精度十进制类型切换到可变精度双精度类型。可变精度类型永远只是一个近似值,因此您可能会发现无明显原因地从您的值中添加或删除便士/美分。它显示它是因为您需要它。只要用ano