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: три тысячи долларов