.NET 中的货币格式在金额和货币之间提供了空格

本文关键字:货币 之间 空格 金额 格式 NET | 更新日期: 2023-09-27 18:30:53

我在 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# 标准?

感谢您的帮助!

所以基本上你想要价格。Value.ToString("C", numberFormatInfo).Replace(' ', '''u00A0');?至少这应该是不间断空格的代码。– 科拉克

与上面的注释完全相同,但改用 asci 值;>价格。Value.ToString("C", numberFormatInfo).替换(字符) 32, (字符) 160);(160 更容易记住>,至少对我来说是这样:))——弗林德伯格

.NET 中的货币格式在金额和货币之间提供了空格

根据我对问题的解释添加一个答案,@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');

顺便说一句(罗斯林代表):

> ''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);
 }
}

使用:

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

你可以替换它。

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

或者更好地将NumberFormatInfo.CurrencyPositivePattern设置为1

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

这是一个演示

Formatting Types

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

  • 货币符号的位置。

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

  • 数值和货币符号之间是否显示空格。

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

// whatever code you had
NumberFormatInfo numberFormatInfo = (NumberFormatInfo)culture.NumberFormat.Clone();
numberFormatInfo.CurrencyPositivePattern = 1; // will format like 25.00CHF

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

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

如果要替换空间,可以像索纳说的那样,

numberString.ToString("C", numberFormatInfo).Replace(" ", "");

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

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

干净的解决方案是将您的CurrencyPositivePattern设置为 0 。例:

CultureInfo _culture= (CultureInfo) culture.Clone();
_culture.NumberFormat.CurrencyPositivePattern = 0;
var stringFormat = number.ToString("c3", _culture);

输入:1234567.845
输出:$1.234.568
输出:€1.234.568
输出:S/1.234.568