You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#数字转单词功能小数位前置0丢失问题求助

问题解决:C#数字转保加利亚语单词小数位前置0丢失

问题描述

开发的C#程序将数字转换为保加利亚语单词时,输入0,02期望输出「нула Цяло и Нула две ст.」,但实际输出丢失小数位前置0,仅显示「нула Цяло и две ст.」。尝试添加double mn = 0.09的判断逻辑仅对0生效,无法解决问题。

问题根源

  1. 小数部分处理时,未判断数值是否小于10,导致前置0的单词未被添加;
  2. 小数部分的数字复用了整数转换的变格形式(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:16:24