【问题标题】:Why is 1 000 000 not equal to 1000000.toString("N", new CultureInfo("fr-FR"))为什么 1 000 000 不等于 1000000.toString("N", new CultureInfo("fr-FR"))
【发布时间】:2020-01-08 11:28:28
【问题描述】:

我围绕字符串转换和货币编写了一些单元测试。

我正在测试字符串是否以我期望的格式返回,给定 CultureInfo 方法已通过。

 public string GetOverspendAmount(double _amount, CultureInfo cultureInfo)
 {
    return amount.ToString("N", cultureInfo);
 }

我正在使用以下调用对这段代码进行单元测试 -

double amount = 1000000;
CultureInfo ci = new CultureInfo("fr-FR", false);

GetOverspendAmount(amount, ci).Should().Be("1 000 000");

但测试失败。预期和实际看起来相同,但是当放入 ascii 转换器时,会显示以下结果

Expected - 1 000 000
49 32 48 48 48 32 48 48 48

Actual - 1 000 000
049 194 160 048 048 048 194 160 048 048 048

它们不是普通空间,但我想知道它们是什么,为什么它们不只是普通空间?

【问题讨论】:

  • 为什么不使用Memory window in the Visual Studio debugger 并查看实际的字节值?
  • 实际的字符串看起来更像“1 000 000,00”而不是“1 000 000”。
  • 好地方,我已经在问题中更正了。这是我试图从我的代码中简化问题的错误
  • 如果你进入控制面板 -> 区域 -> 将格式设置为“法语 - 法国” -> 附加设置 -> 查看“数字分组符号”的设置,您可以看到这个特殊的空格字符.这是一个特殊的不间断空格(您可以从下拉列表中选择其他字符)。

标签: c# unit-testing formatting tostring cultureinfo


【解决方案1】:

空格是不间断空格 (UTF-8 194 160) 而不是常规空格 (UTF-8 32)。

https://utf8-chartable.de/unicode-utf8-table.pl?utf8=dec

不间断空格在 HTML 等格式中有所不同,因为它不允许在其后自动换行。它也不允许多个空间折叠成一个空间。

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2010-10-01
    • 2020-10-14
    相关资源
    最近更新 更多