Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 十进制ToString F02变为逗号_C#_Tostring - Fatal编程技术网

C# 十进制ToString F02变为逗号

C# 十进制ToString F02变为逗号,c#,tostring,C#,Tostring,如果我打开控制台应用程序并运行以下操作: decimal urmom = 84.3400m; Console.WriteLine(urmom.ToString("F02")); 我得到了84.34 在我正在运行的web应用程序中,我有以下代码: public static string PayPalJunk(string successURL, string failureURL, decimal total, string currency) { NVPCodec encoder =

如果我打开控制台应用程序并运行以下操作:

decimal urmom = 84.3400m;
Console.WriteLine(urmom.ToString("F02"));
我得到了
84.34

在我正在运行的web应用程序中,我有以下代码:

public static string PayPalJunk(string successURL, string failureURL, decimal total, string currency)
{
    NVPCodec encoder = new NVPCodec();
    encoder["PAYMENTREQUEST_0_AMT"] = total.ToString("F02");
    //...
}
即使我在执行该行之前中断并在
total.ToString(“F02”)
上执行
Watch
,我也会得到
84,34
。参数列表中total的鼠标悬停显示
84.34


为什么??十进制只是一个值,对吗?它不是具有某些隐藏属性的引用对象,这些属性可能已被某些区域性信息损坏。。。是吗?

您得到这些结果是因为两种环境中的文化不同。试试这个:

encoder["PAYMENTREQUEST_0_AMT"] = total.ToString("F02", System.Globalization.CultureInfo.InvariantCulture);

或者您希望将字符串格式化为的任何区域性。

它与正在运行的线程的区域性有关。如果您想在en-US中格式化字符串,而不考虑线程,那么您需要将特定区域性传递给ToString。如果它在web服务器下运行,并且您希望忽略重新调整浏览器/客户端的区域性,则还可以在web.config中指定静态区域性

如何在
ToString

如何配置web.config

另见


为什么??十进制只是一个值,对吗

否,您正在将十进制转换为字符串,根据区域性的不同,表示十进制的字符串可能会以不同方式显示。例如:在荷兰,逗号用于将整数值与数值的部分/小数部分分开,句号(.)用于分隔千、百万、十亿、万亿等分组。在美国,这些符号的含义完全相反


检测调用者的区域性通常是一件好事,返回基于调用者区域性格式化的数据通常也是理想的行为。如果不是,请参见上面的2种方法,以确保代码始终能够返回一致的格式化数据。

web服务器的默认区域性是什么?“为什么?”——“为什么”什么<代码>十进制只是“一个值”,是的。但是,除非您阅读二进制十进制格式,否则在您唯一一次看到
十进制
值时,它将从其实际值转换为文本,而这种转换取决于执行转换的环境。默认情况下,
ToString()
方法使用环境的区域性,当环境的区域性不同时,您将得到不同的结果。那么,你的问题是什么?调试器使用调试器环境的设置显示值,web服务器使用其设置显示值。有关相关讨论,请参阅,以及有关堆栈溢出的许多其他类似问题。感谢Igor。你指出了我遗漏的一件事
decimal
不是特定于区域性的,但ToString()是。我已经在改变文化来强迫我们,但是这个秘密让我很难受。事实证明,最近有人添加了
System.Threading.Thread.CurrentThread.CurrentUICulture
。唉声叹气
var formatted1 = total.ToString("F02", System.Globalization.CultureInfo.InvariantCulture);
// or
var formatted2 = total.ToString("F02", new System.Globalization.CultureInfo("en-US"));
<globalization uiCulture="en" culture="en-US" />