44

假设我有以下十进制数,我必须对其进行格式化,以便每千个应该用空格分隔:

 897.11 to 897.11
 1897.11 to 1 897.11
 12897.11 to 12 897.11
 123897.11 to 123 897.11

我试过 Decimal.ToString("0 000.00")。尽管当数字为 1897.11 时这很有效。但是当它是 897.11 时,我得到 0 897.11。

4

6 回答 6

87

传入NumberFormatInfo带有自定义NumberGroupSeparator属性的自定义,并使用#,#格式告诉它进行数字组。此示例使用不变区域性的数字格式作为其基础。

var nfi = (NumberFormatInfo)CultureInfo.InvariantCulture.NumberFormat.Clone();
nfi.NumberGroupSeparator = " ";
string formatted = 1234897.11m.ToString("#,0.00", nfi); // "1 234 897.11"
于 2013-07-08T13:32:18.593 回答
21

您需要一个自定义数字格式提供程序,您可以在其中自己更改字符:

    static void Main(string[] args)
    {
        decimal d = 2000000;

        var f = new NumberFormatInfo {NumberGroupSeparator = " "};

        var s = d.ToString("n", f); // 2 000 000.00
    }

在这里,我还指定将其格式化为数字(使用"n"),请参阅此链接了解其他格式化选项:

标准数字格式字符串

在这种情况下,如果您将其格式化为货币或百分比,它将不起作用,因为您可能已经注意到它们NumberFormatInfo具有单独的属性。

当前的文化格式信息可以在 上找到System.Globalization.CultureInfo.CurrentCulture.NumberFormat

于 2013-07-08T13:35:28.073 回答
11

尝试这个

int testNumber = 134566548;
Console.WriteLine(string.Format("{0:N}", testNumber));

您将收到:134 566 548,00

不要忘记你的文化。

于 2013-07-08T13:32:07.583 回答
9

使用自定义格式字符串,但使用 '#' 而不是 '0' 一个 0 是一个强制标记,无论数字有多长,它都会在那里,井号 (#) 是可选标记,它实际上只会用于数字在号码中。

  Decimal.ToString("# ###.00")  

笔记。我将把它留在这里,但@Tim S 的回答更好。

当我尝试这个时,我看到它只生成第一个分隔符......我猜分隔符只适用于逗号和句点。作为一种解决方法(达到您期望的最大大小数),请尝试使用此方法。

  Decimal.ToString("# ### ### ### ###.00")  
于 2013-07-08T13:27:56.193 回答
4

瑞典 使用千位分隔符作为 Space(" "),使用小数点分隔符作为 Comma(,)。我们可以通过以下方式实现这一点。

decimal myNumbber = 5878.476M;
var swedishCulture = new CultureInfo("sv-SE");           
swedishCulture.NumberFormat.NumberDecimalSeparator = ",";
swedishCulture.NumberFormat.NumberGroupSeparator = " ";
var s = myNumbber.ToString("#,###.00", swedishCulture);

这给出了输出

"5 878,48"
于 2020-01-21T05:42:20.023 回答
3

挪威语语言环境使用空格作为分隔符,因此如果您专门为挪威人设计网站或应用程序,那么您可以使用:

(123897.11).ToString("n",new CultureInfo("nb-NO"))

这导致

"123 897,11"

显然,如果您不是为挪威市场编写应用程序,那么这将是一个愚蠢的解决方案。

于 2016-09-20T15:55:14.120 回答