C# 货币到字符串

C# 货币到字符串,c#,.net,currency,C#,.net,Currency,通常我会使用string.Format()获取格式化字符串 但我得到的要求是,所有金额都应打印为文本,而不是数字 i、 e.类似于: Format(3000, "us"); // => Resulting text: "three thousand dollars" 是否有一个.NET库可以处理这个问题(俄语是必需的) 是否有一个.NET库可以处理这个问题(俄语是必需的) 简短回答:否。 你必须自己写,我建议你看看以下内容: , 正如其中一位所说,看看它,并将其用于更广泛的谷歌搜索 除此

通常我会使用
string.Format()
获取格式化字符串

但我得到的要求是,所有金额都应打印为文本,而不是数字

i、 e.类似于:

Format(3000, "us"); // => Resulting text: "three thousand dollars"
是否有一个.NET库可以处理这个问题(俄语是必需的)

是否有一个.NET库可以处理这个问题(俄语是必需的)

简短回答:否。

你必须自己写,我建议你看看以下内容: , 正如其中一位所说,看看它,并将其用于更广泛的谷歌搜索

除此之外,还有货币名称的问题,
'us'
是否应该表示货币或语言,甚至是两者?加拿大元和美元不同吗

例如,这是内置的:

// Gives USD
var ISOCode = System.Globalization.RegionInfo.RegionInfo("US").ISOCurrencySymbol
// Gives $
var symbol = System.Globalization.RegionInfo.RegionInfo("US").CurrencySymbol
// Gives USD Dollar (i believe :))
var nameUSDENG = System.Globalization.RegionInfo.RegionInfo("US").CurrencyEnglishName
// Gives Svensk Krona
var nameSEKSWE = System.Globalization.RegionInfo.RegionInfo("SE").CurrencyNativeName
// Gives Swedish Krona
var nameSEKENG = System.Globalization.RegionInfo.RegionInfo("SE").CurrencyEnglishName

我建议您从那里开始,看看这条路会带您走到哪里。

我已经环顾了四周,但找不到合适的版本来转换为英语货币,因此我将一些版本组合到了这个解决方案中:

public static class NumberExtensions
{
    public static String toCurrency(this double number, String major, String minor, String endStr, int minorLength)
    {
        return ((decimal)number).toCurrency(major, minor, endStr, minorLength);
    }

    public static String toCurrency(this decimal number, String major, String minor, String endStr, int minorLength)
    {

        if (String.IsNullOrWhiteSpace(major)) throw new Exception("Must specify major currency");
        if (String.IsNullOrWhiteSpace(minor)) throw new Exception("Must specify minor currency");

        String numb = number.ToString();
        String val = "", wholeNo = numb, points = "", andStr = major, pointStr = "";
        int decimalPlace = numb.IndexOf(".");
        if (decimalPlace > 0)
        {
            wholeNo = numb.Substring(0, decimalPlace);
            points = numb.Substring(decimalPlace + 1);
            if (points.Length > minorLength) throw new Exception("Incorrect format");
            if (Convert.ToInt32(points) > 0)
            {
                andStr = major + " and";
                endStr = minor + " " + endStr;
                pointStr = Int32.Parse(points.Length == 1 ? points + "0" : points).toWords();
            }
        }
        if (String.IsNullOrWhiteSpace(pointStr))
        {
            if (endStr == minor + " " || endStr == null)
            {
                val = String.Format("{0} {1}", Int32.Parse(wholeNo).toWords().Trim(), andStr.Trim());
            }
            else
            {
                val = String.Format("{0} {1} {2}", Int32.Parse(wholeNo).toWords().Trim(), andStr.Trim(), endStr.Trim());
            }
        }
        else
        {
            val = String.Format("{0} {1} {2} {3}", Int32.Parse(wholeNo).toWords().Trim(), andStr.Trim(), pointStr.Trim(), endStr.Trim());
        }
        return val;
    }

    public static string toWords(this int number)
    {
        if (number == 0)
            return "Zero";

        if (number < 0)
            return "minus " + Math.Abs(number).toWords();

        string words = "";

        if ((number / 1000000) > 0)
        {
            words += (number / 1000000).toWords().TrimEnd() + " Million ";
            number %= 1000000;
        }

        if ((number / 1000) > 0)
        {
            words += (number / 1000).toWords().TrimEnd() + " Thousand ";
            number %= 1000;
        }

        if ((number / 100) > 0)
        {
            words += (number / 100).toWords().TrimEnd() + " Hundred ";
            number %= 100;
        }

        if (number > 0)
        {
            if (words != "")
                words += "and ";

            var unitsMap = new[] { "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen" };
            var tensMap = new[] { "Zero", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" };

            if (number < 20)
                words += unitsMap[number];
            else
            {
                words += tensMap[number / 10];
                if ((number % 10) > 0)
                    words += "-" + unitsMap[number % 10];
            }
        }

        return words;
    }
}
享受这完美的作品:D

学分

  • (感谢Lankymart找到这个。)
  • 其他人未知,请编辑,如果发现,请给予评分

我还没有测试过,但也许这能解决你的问题

它说它也支持俄语

从软件包说明中:

数字到文本转换器。支持的语言英语俄语西班牙语土耳其语

用法:

var number = 123456.78
var moneyText = number.ToText("usd", "en");

var number = 123456.78;
var moneyText = number.ToText(Nut.Currency.USD, Nut.Language.English);

var number = 123456.78;
var options = new Nut.Options {
    MainUnitNotConvertedToText = true,
    SubUnitNotConvertedToText = true,
    MainUnitFirstCharUpper = true,
    SubUnitFirstCharUpper = true,
    CurrencyFirstCharUpper = true,
    SubUnitZeroNotDisplayed = true
}
var moneyText = number.ToText(Nut.Currency.USD, Nut.Language.English, options);

这里有一个成熟的图书馆供你使用。这叫人性化

你可以在这里看到它的意义:

正如你所看到的,它做了你需要的事情,还有更多的事情。它有很多地方化

一些例子:

1.ToWords() => "one"
10.ToWords() => "ten"
11.ToWords() => "eleven"
122.ToWords() => "one hundred and twenty-two"
3501.ToWords() => "three thousand five hundred and one"
您还可以将第二个参数“语法性别”传递给ToWords,以指定数字应以何种性别输出


对于俄语,您可以使用我的库:
它也可在nuget上获得:

例如:

var unit = new UnitOfMeasure(Gender.Masculine, "доллар", "доллара", "долларов");
var text = RussianConverter.Format(3000, unit);
Console.WriteLine(text);
// Output: три тысячи долларов

在.net框架中没有为此内置任何内容。我很确定有第三方库,但我现在不知道。一个类似的问题,遗憾的是没有任何多语言的答案-如果你知道该语言的规则(有些规则不如英语那么直截了当,例如法语有一些特殊情况),你可以从中构建自己的。也许
CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol
检查这个问题,它将用于您的需求。。。我不认为在什么地方有这样的俄语开源库。你需要一个俄罗斯自由职业者,这将为你实现这一点。对于.NET库,我指的不是.NET框架,而是任何外部库(商业或开源)。我发现它不支持russianIt,根据上面提供的信息,你可以很容易地推出自己的。这样你就有了更大的灵活性。正如你在我的回答中所看到的,有一些库可以做到这一点。@DarrenYoung我的坏,修复了
1.ToWords(GrammaticalGender.Masculine) => "один"
1.ToWords(GrammaticalGender.Feminine) => "одна"
1.ToWords(GrammaticalGender.Neuter) => "одно"
var unit = new UnitOfMeasure(Gender.Masculine, "доллар", "доллара", "долларов");
var text = RussianConverter.Format(3000, unit);
Console.WriteLine(text);
// Output: три тысячи долларов