为什么.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
(斯洛伐克克朗),因为2005年它是国家货币。(好吧,这不会发生。但我没有在任何不晚于2.0的系统上尝试过。)我不知道.NET,但是您的格式化程序允许您在格式字符串中省略“M”吗
因此:
1234.56
而不是这个1234.56M
我说不出设计师的想法,但他们的决定对我来说很有意义。回答您的问题:
简言之,有两个独立的设置可以让您更灵活,让事情更简单。将事物结合起来会使更多的工作单独改变事物。我改变了主意:我同意你的观点,货币是文化的一部分,这很奇怪 在.NET和Java中,用值指定单位并不常见。您通常不使用单位指定温度、距离或货币。对于大多数意图和目的,单位由开发商假设:距离为米,温度为摄氏度。对于给定的区域性,.NET中没有指定默认的距离单位或温度单位 为了保持一致,.NET Framework也不应该向区域性中添加货币信息。大多数人使用不止一种货币,有些国家甚至接受多种货币。不是每个特定文化的人都会使用一种且仅使用一种货币 .NET framework包含一个
System.Currency
类,但它是隐藏的(内部),仅用于Decimal.ToOACurrency()
方法。它也不是很有用。自2002年以来,Java包含一个Currency
类,但由于.NET Framework是在2000年创建的,许多设计错误都是从Java复制过来的,这可能是其中之一。但是,我找不到关于JavaLocale
类是否包含(或包含)任何货币信息的信息,我也不是通灵者
那么,从.NET中从未指定单位的观点出发,一种文化不应该有默认的货币,那么他们应该把货币价值的货币单位放在哪里呢?当然,他们应该创建一个Currency
类
快速搜索并没有打开任何货币库,因此作为一个实验,我创建了一个用于处理货币(包括货币单位)的便携式库。它工作得出奇地好 你可以在这里下载: -用于处理货币和货币的便携式.NET库
如果有人有任何建议或改进,请执行拉取请求或创建问题。我只是认为,当应用程序中可能出现多种货币时,不应使用此选项。如果您有一个简单的应用程序,它可以像处理数字一样处理金钱,而数字必须以当地货币进行解释,那么它可能会很有用 在所有其他情况下,不要使用它
我不认为有很多这样的应用程序是有意义的。为什么.NET货币格式包含货币符号
因为它是一种货币格式 文字类型对格式没有影响。我试过使用不同的类型(M、D、甚至L)。
M
只是声明一个十进制常量,而不是双精度常量。我不认为小数的格式不同。明白了。这只是一个想法。包含M非常重要,否则您将从绝对精度十进制类型切换到可变精度双精度类型。可变精度类型永远只是一个近似值,因此您可能会发现无明显原因地从您的值中添加或删除便士/美分。它显示它是因为您需要它。只要用ano