【问题标题】:C# culture info/setting up a specific tostring for currencyC#文化信息/为货币设置一个特定的tostring
【发布时间】:2012-05-02 14:15:01
【问题描述】:

我正在寻找一种客户十进制格式。如果我执行“(3003.3003d).ToString(#,###.00##”),我现在得到的是“3,003.3003”。我想获得的格式是“3'003.300,3”。

我可以使用客户方法 math.floor 并自己将其分解,但我很好奇是否有一种方法可以使用文化信息来做我正在寻找的事情。有人知道这样做的方法吗?

用自定义 IFormatprovider 作为答案写了这个人,因为教程非常好,但我不相信当前的文化存在我需要的东西。这是我的最终答案:

private string ToCustomDecimal(decimal Input, int MaxLenPostDec, int MinLenPostDec)
    {
        string CustD;
        string[] Split = Input.ToString().Split('.');
        string BigNum = Split[0];
        string SmallNum = "0";
        if (Split.Length > 1)
            SmallNum = Split[1];
        int Spot = 0;
        bool FirstD = false;
        string OutBigNum = "";
        for (int Locc = BigNum.Length - 1; Locc >= 0; Locc--)
        {
            Spot++;
            if (FirstD == false)
            {
                OutBigNum = BigNum.Substring(Locc, 1) + OutBigNum;
                FirstD = true;
            }
            else
                OutBigNum = (Spot % 3 == 1 ? "'" : "") + BigNum.Substring(Locc, 1) + OutBigNum;
        }
        Spot = 0;
        FirstD = false;
        string OutSmallNum = "";
        for (int Locc = 0; Locc < SmallNum.Length; Locc++)
        {
            Spot++;
            if (FirstD == false)
            {
                OutSmallNum += SmallNum.Substring(Locc, 1);
                FirstD = true;
            }
            else
            {
                OutSmallNum += (Spot % 3 == 1 ? "," : "") + SmallNum.Substring(Locc, 1);
            }
            if (Locc >= MaxLenPostDec - 1)
                break;
            if (Locc == SmallNum.Length - 1 && MinLenPostDec > Locc)
            {
                for (int Locc2 = Locc; Locc2 < MinLenPostDec - 1; Locc2++)
                {
                    Spot++;
                    OutSmallNum += (Spot % 3 == 1 ? "," : "") + 0;
                }
            }
        }
        CustD = OutBigNum + "." + OutSmallNum;
        return CustD;
    }

【问题讨论】:

  • 我怀疑您没有使用正确的数据类型(十进制)来实现您想要实现的目标。
  • 我会用自定义 IFormatprovider 作为答案写下这个家伙,尽管这不是我想要的。对于 Darin,我在示例中使用了 double (3000d),在最终结果中使用了小数。我最终创建了自己的方法,发布了以下内容,因为我想不出一种当前的文化可以解析我想要的方式并广泛到任何长度。

标签: c# tostring cultureinfo


【解决方案1】:

您应该查看过载ToString("#,###.00##", myFormatProvider)

所以你需要一个custom IFormatprovider

【讨论】:

    【解决方案2】:

    这似乎可行,但我没有测试它。

    (3003.3003d).ToString(@"#\'###.00#\,##")
    

    【讨论】:

    • 其实应该是(3003.3003d).ToString(@"#\'###.00#','##")。您必须转义 ',
    • 感谢@JimSchubert,已更改。
    • 没问题。您仍然需要 @ 来启动字符串,否则 \, 是无法识别的转义。 :P
    【解决方案3】:

    看看Decimal.ToString IFromatProvider 的重载。我猜你要么想用特定的(CultureInfo.CreateSpecificCulture())或当前的文化(CultureInfo.CurrentCulture)向用户显示货币。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多