C#数字转单词功能小数位前置0丢失问题求助
问题解决:C#数字转保加利亚语单词小数位前置0丢失
问题描述
开发的C#程序将数字转换为保加利亚语单词时,输入0,02期望输出「нула Цяло и Нула две ст.」,但实际输出丢失小数位前置0,仅显示「нула Цяло и две ст.」。尝试添加double mn = 0.09的判断逻辑仅对0生效,无法解决问题。
问题根源
- 小数部分处理时,未判断数值是否小于10,导致前置0的单词未被添加;
- 小数部分的数字复用了整数转换的变格形式(
unitsс数组),而保加利亚语中小数部分需使用基数词主格(units数组),导致数字形式错误。
解决方案
修改代码要点
- 移除冗余的
mn变量,直接判断整数部分是否为0来切换「Цяло」和「лв.」的显示; - 新增小数部分专用的转换方法,确保数字使用正确的保加利亚语形式;
- 处理小数部分时,若数值小于10,主动添加前置0的单词。
修改后的完整代码
using System; namespace NumberToBulgarian { class Program { static void Main(string[] args) { Console.OutputEncoding = System.Text.Encoding.Unicode; // OT VIKTOR BOTKOV 304sr try { Console.WriteLine("Въведете число.....:"); string number = Console.ReadLine(); number = ConvertAmount(double.Parse(number)); Console.WriteLine("Числото изписано в думи е : \n{0}", number); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } private static String[] units = { "нула", "едно", "две", "три", "четири", "пет", "шест", "седем", "осем", "девет", "десет", "единайсет", "дванайсет", "тринайсет", "четиринайсет", "петнайсет", "шеснайсет", "седемнайсет", "осемнайсет", "деветнайсет" }; private static String[] tens = { "", "", "двайсет", "трийсет", "четиресет", "педесет", "шейсет", "седемдесет", "осемдесет", "деведесет" }; private static String[] hundreds = {"","сто", "двеста", "триста","четиристотин", "петстотин", "шестстотин", "седемстотин", "осемстотин", "деветстотин" }; private static String[] thousands = {"","хиляда","две хиялди", "три хиляди","четири хиляди", "пет хиляди", "шест хиляди", "седем хиляди", "осем хиляди", "девет хиляди" }; private static String[] unitsс = { "нула", "един", "два" }; public static String ConvertAmount(double amount) { try { Int64 amount_int = (Int64)amount; Int64 amount_dec = (Int64)Math.Round((Decimal)(amount - (double)(amount_int)) * 100); string decPart; if (amount_dec < 10) { // 小数部分小于10时,添加前置0的单词 decPart = units[0] + " " + ConvertDecimal(amount_dec); } else { decPart = ConvertDecimal(amount_dec); } if (amount_dec == 0) { return Convert(amount_int) + " лв."; } else if (amount_int == 0) { return Convert(amount_int) + " Цяло и " + decPart + " ст."; } else { return Convert(amount_int) + " лв. и " + decPart + " ст."; } } catch (Exception e) { Console.WriteLine(e.Message); return ""; } } // 专门处理小数部分的数字转换,使用正确的保加利亚语主格形式 public static String ConvertDecimal(Int64 i) { if (i < 20) { return units[i]; } if (i < 100) { return tens[i / 10] + ((i % 10 > 0) ? " и " + ConvertDecimal(i % 10) : ""); } return Convert(i); } public static String Convert(Int64 i) { Console.OutputEncoding = System.Text.Encoding.Unicode; if (i <= 2) { return unitsс[i]; } if (i < 20) { return units[i]; } if (i < 100) { return tens[i / 10] + ((i % 10 > 0) ? " и " + Convert(i % 10) : ""); } if (i < 1000) { return hundreds[i / 100] + ((i % 100 > 0) ? " и " + Convert(i % 100) : ""); } if (i < 100000) { return Convert(i / 1000) + " Хиляди " + ((i % 1000 > 0) ? " " + Convert(i % 1000) : ""); } else if (i < 1000000) { return Convert(i / 10000) + " Хиляди " + ((i % 10000 > 0) ? " и " + Convert(i % 10000) : ""); } if (i < 10000000) { return Convert(i / 1000000) + " Милиона " + ((i % 1000000 > 0) ? " " + Convert(i % 1000000) : ""); } if (i < 100000000) { return Convert(i / 1000000) + " Милиона " + ((i % 1000000 > 0) ? " и " + Convert(i % 1000000) : ""); } if (i < 1000000000) { return Convert(i / 1000000) + " Милиона " + ((i % 1000000 > 0) ? " " + Convert(i % 1000000) : ""); } if (i < 10000000000) { return Convert(i / 1000000000) + " Милиaрда " + ((i % 1000000000 > 0) ? " " + Convert(i % 1000000000) : ""); } return Convert(i / 1000000000000) + " " + ((i % 1000000000000 > 0) ? " " + Convert(i % 10000000000000) : ""); } } }
说明
- 新增
ConvertDecimal方法,确保小数部分的数字使用units数组中的主格形式,符合保加利亚语表达习惯; - 在
ConvertAmount中判断小数部分是否小于10,若满足则拼接前置0的单词; - 移除
mn变量,直接通过amount_int == 0判断是否显示「Цяло」,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Space Dogge
相关产品推荐
相关产品推荐

