【问题标题】:Decimal ToString F02 becomes Comma十进制 ToString F02 变为逗号
【发布时间】:2016-09-20 15:49:23
【问题描述】:

如果我打开一个控制台应用程序并运行它:

decimal urmom = 84.3400m;
Console.WriteLine(urmom.ToString("F02"));

我收到84.34

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

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的Mouseover显示84.34。

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

【问题讨论】:

  • 网络服务器的默认文化是什么?
  • “为什么?” -- “为什么”是什么? decimal 是“只是一个值”,是的。但是,除非您阅读二进制十进制格式,否则您唯一看到 decimal 值的时候,它会从其实际值转换为文本,并且这种转换取决于执行转换。 ToString() 方法默认使用环境的文化,当环境的文化不同时,你会得到不同的结果。那么,你的问题是什么?您的调试器使用调试器的环境设置向您显示值,而 Web 服务器使用其显示值。
  • 有关相关讨论,请参阅 stackoverflow.com/questions/30889114/…、stackoverflow.com/questions/33552847/… 以及 Stack Overflow 上的许多其他类似问题。

标签: c# tostring


【解决方案1】:

这与正在运行的线程的文化有关。如果您想获取 en-US 格式的字符串,而不管线程如何,那么您需要将特定区域性传递给 ToString。如果它在 Web 服务器下运行并且您想忽略请求浏览器/客户端的文化,您还可以在 web.config 中指定静态文化。

如何在ToString 中指定文化

var formatted1 = total.ToString("F02", System.Globalization.CultureInfo.InvariantCulture);
// or
var formatted2 = total.ToString("F02", new System.Globalization.CultureInfo("en-US"));

见Decimal.ToString Method (String,IFormatProvider)

如何配置 web.config

<globalization uiCulture="en" culture="en-US" />

另见How to: Set the Culture and UI Culture for ASP.NET Web Page Globalization


为什么?小数只是一个值,对吧?

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

检测调用者的文化通常是一件好事,并且返回基于调用者文化格式化的数据通常也是期望的行为。如果不是,那么请参阅上面的 2 种方法来确保代码始终可以返回格式一致的数据。

【讨论】:

  • 谢谢伊戈尔。你指出我错过的一件事。 decimal 不是特定于文化的,但 ToString() 是。我已经在改变文化以迫使我们进入美国,但这个谜团正在扼杀我。原来,最近有人添加了System.Threading.Thread.CurrentThread.CurrentUICulture。哎哟
【解决方案2】:

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

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

或您希望将字符串格式化为的任何文化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多