将双精度浮点数转换为字符串,保留N位小数,使用点作为小数分隔符,不使用千位分隔符。

92

我需要将一个十进制数转换为一个带有 N 个小数位数(两个或四个),并且没有千位分隔符的字符串:

'XXXXXXX (小数点) DDDDD'

使用 CultureInfo.InvariantCulture 的问题是它在千位上放置了','进行分隔。

更新:

这对于 decimal 和 double 类型都适用。


我的之前的问题:需要将 double 或 decimal 转换为字符串

5个回答

176

对于一个decimal,使用ToString方法,并指定Invariant culture来获取小数点作为十进制分隔符:

value.ToString("0.00", System.Globalization.CultureInfo.InvariantCulture)

long 类型是整数类型,因此没有小数部分。您可以将其格式化为字符串,然后再添加一些零:

value.ToString() + ".00"

千位分隔符怎么样?它由什么控制? - Captain Comic
1
请告诉我".NET如何解析"0.00""。 - Captain Comic
2
@Captain Comic:当您使用格式“N2”时,会获得千位分隔符,但是使用自定义格式“0.00”时不会。自定义格式“0.00”表示“小数点分隔符之前的一个或多个数字,与文化相关的小数点分隔符,以及小数点分隔符后恰好两个数字”。通过指定不变的文化,它使用的是小数点作为分隔符。 - Guffa
Guffa,所以“0.00”表示没有千位分隔符?我猜我需要好好阅读格式说明文档。 - Captain Comic
1
在这里,您可以找到关于此的良好文档。 https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings - Jonatan Machado

60

自定义数字的小数点非常容易。我花了大约两个小时才弄清楚 :D。你看到你使用了当前或者其他指定的文化风格吧?那么,解析器需要的就是一个IFormatProvider。如果你将CultureInfo.CurrentCulture.NumberFormat作为格式化程序传递给它,它就会根据你当前文化的NumberDecimalSeparator格式化双精度浮点数。我的做法只是创建了NumberFormatInfo类的一个新实例,并将其NumberDecimalSeparator属性设置为我想要的任何分隔符字符串。完整的代码如下:

double value = 2.3d;
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = "-";
string x = value.ToString(nfi);

结果是?"2-3"


11

您可以使用

value.ToString(CultureInfo.InvariantCulture)

获取精确的双精度值,而不需要设置精度。


你需要小心处理这个问题,因为如果程序在不同文化的环境下运行,如果你没有设置区域,可能会导致问题。 - Gonzo Gonzales

3

我更喜欢使用ToString()IFormatProvider

double value = 100000.3
Console.WriteLine(value.ToString("0,0.00", new CultureInfo("en-US", false)));

输出:10,000.30


2
这会导致问题。如果您将小数符号覆盖为逗号,则会输出 100,000,30。这是因为您正在使用的 CultureInfo 构造函数将尊重用户设置,例如小数符号。更安全的方法是要么使用 CultureInfo.Invariant,要么像这样构建它: new CultureInfo("en-US", false)将 false 传递给构造函数告诉它不要尊重用户自定义设置。 - Carl
OP希望“无千位分隔符”。 - Thomas Weller

-6

你可以简单地使用 decimal.ToString() 方法

对于两个小数位

myDecimal.ToString("0.00");

保留四位小数

myDecimal.ToString("0.0000");

这将使用点作为小数分隔符,无论文化背景如何都不使用千位分隔符。


13
不,它会根据文化习惯给出小数分隔符,而不总是点号。 - Guffa
4
你的格式字符串中的 . 是小数分隔符的占位符,而不是字面上的 .。因此,例如,如果你的文化是 fr-FR,那么数字将显示为 1,23 或 1,2345 等。 - LukeH
1
我尝试将Windows下区域设置中的小数点更改为逗号,但它仍然打印点而不是逗号。如果这只是一个占位符,为什么它不会改变呢? - Øyvind Bråthen
3
你的个人文化设置不影响应用程序,因为它从其他地方获取设置,这取决于应用程序的类型。 - Guffa
2
@Guffa:这个我需要进一步研究,以便了解情况。感谢您在这里的指引。 - Øyvind Bråthen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接