6

我在 C# 中遇到货币格式问题。我正在使用框架 2.0。

当我使用此代码时:

CultureInfo culture = new CultureInfo("fr-FR", false);
NumberFormatInfo numberFormatInfo = (NumberFormatInfo)culture.NumberFormat.Clone();
numberFormatInfo.CurrencySymbol = "CHF";

price.Value.ToString("C", numberFormatInfo)似乎给了我一个在金额和货币之间有空格的字符串。那太糟了!我绝对需要一个不间断的空间!到底是怎么回事?我缺少格式属性还是 C# 标准?

谢谢你的帮助!

所以基本上你想要 price.Value.ToString("C", numberFormatInfo).Replace(' ', '\u00A0');?至少那应该是非破坏空间的代码。– 科拉克

与上述评论者完全相同,但使用 asci-values 代替;> price.Value.ToString("C", numberFormatInfo).Replace((char) 32, (char) 160); (160 很多 > 更容易记住,至少对我来说 :))——弗林德伯格

4

6 回答 6

8

根据我对问题的解释添加答案,@Corak 似乎分享了这一点。

// Convert "breaking" spaces into "non-breaking" spaces (ie the html  )
price.Value.ToString("C", numberFormatInfo).Replace((char) 32, (char) 160);

对 unicode 做同样的事情(@Corak 的链接提供):

// Convert "breaking" spaces into "non-breaking" spaces without int cast to char
price.Value.ToString("C", numberFormatInfo).Replace(' ', '\u00A0');

顺便说一句(roslyn repl):

> '\u00A0' == (char) 160
true

如果您要经常使用它,还请获取扩展方法:

public static class StringExtensions 
{// CurrencyType is your currency type, guessing double or decimal?
 public static string ToCurrencyString(this CurrencyType value, IFormatInfo format)
 {
    return value.ToString("C", format).Replace((char) 32, (char) 160);
 }
}
于 2013-09-11T15:23:50.280 回答
6

采用:

numberFormatInfo.CurrencyPositivePattern = 1;

对于价值1,格式是货币符号在n$哪里,在你的情况下它的$CHF

格式化类型 - MSDN

CurrencyNegativePattern 或 CurrencyPositivePattern 属性,它返回一个整数,用于确定以下内容:

  • 货币符号的位置。
  • 负值是由前导负号、尾随负号还是括号表示。
  • 数值和货币符号之间是否出现空格。

试试下面的代码:

    CultureInfo culture = new CultureInfo("fr-FR", false);
    NumberFormatInfo numberFormatInfo = (NumberFormatInfo)culture.NumberFormat.Clone();
    numberFormatInfo.CurrencySymbol = "CHF";
    numberFormatInfo.CurrencyPositivePattern = 1;
    decimal d = 123.23M;
    var temp = d.ToString("C", numberFormatInfo);

输出:

123,23CHF
于 2013-09-11T14:22:09.127 回答
5

你可以更换它。

price.ToString("C", numberFormatInfo).Replace(" ", "")

或更好地设置NumberFormatInfo.CurrencyPositivePattern1

numberFormatInfo.CurrencySymbol = "CHF";
numberFormatInfo.CurrencyPositivePattern = 1;

完整示例;

CultureInfo culture = new CultureInfo("fr-FR", false);
NumberFormatInfo numberFormatInfo = (NumberFormatInfo)culture.NumberFormat.Clone();
numberFormatInfo.CurrencySymbol = "CHF";
numberFormatInfo.CurrencyPositivePattern = 1;
Console.WriteLine((1.5M).ToString("C", numberFormatInfo));

输出将是;

1,50CHF

这里有一个DEMO

Formatting Types

CurrencyNegativePattern 或 CurrencyPositivePattern 属性,它返回一个整数,用于确定以下内容:

  • 货币符号的位置。

  • 负值是由前导负号、尾随负号还是括号表示。

  • 数值和货币符号之间是否出现空格。

于 2013-09-11T14:16:21.843 回答
3

您可以配置CurrencyPositivePattern并将其设置为适当的值。

// whatever code you had
NumberFormatInfo numberFormatInfo = (NumberFormatInfo)culture.NumberFormat.Clone();
numberFormatInfo.CurrencyPositivePattern = 1; // will format like 25.00CHF
于 2013-09-11T14:18:51.203 回答
1

似乎默认情况下,当涉及到美元以外的其他货币时,它包含空格

double value = 12345.6789;
Console.WriteLine(value.ToString("C", CultureInfo.CurrentCulture));

Console.WriteLine(value.ToString("C3", CultureInfo.CurrentCulture));

Console.WriteLine(value.ToString("C3", 
                  CultureInfo.CreateSpecificCulture("da-DK")));
// The example displays the following output on a system whose 
// current culture is English (United States): 
//       $12,345.68 
//       $12,345.679 
//       kr 12.345,679

如果你想替换空间,你可以使用 Soner 说的,

numberString.ToString("C", numberFormatInfo).Replace(" ", "");
于 2013-09-11T14:18:59.493 回答
0

在您的 global.asax 中,您可以全局更改文化并选择像这样删除空间:

CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture("fr-FR"); //Get you own culture
cultureInfo.NumberFormat.CurrencyPositivePattern = 1; //To remove the space
Thread.CurrentThread.CurrentUICulture = cultureInfo; //Apply globaly to your application
Thread.CurrentThread.CurrentCulture = cultureInfo; //Apply globaly to your application
于 2019-02-15T08:43:19.840 回答