首页 > 解决方案 > 如何将 ulong 数据类型输入转换为字符串以进行口头数字输出?

问题描述

我目前正在尝试在 C# 中创建一个应用程序,该应用程序接受ulong数字输入并输出数字的口头表示(即 12 到“十二”,45238 到“四万五千二百三十八”等),我会喜欢它能够通过uLong.MaxValue

我是编程新手,并且真的在这个概念上苦苦挣扎。我曾尝试实现 Lists 和StringBuilder更早的版本,因为我认为它们可能很有用,但我想不通。我正在尝试调整基本代码,使其适用于ulong数据类型,但出现以下错误:

错误 CS0121:调用在以下方法或属性之间不明确:“Math.Abs​​(decimal)”和“Math.Abs​​(float)”错误 CS1503:参数 1:无法从“字符串”转换为“ulong”

这是基本代码:

using System;
using static System.Console;
using System.Text;
using System.Text.RegularExpressions;
using System.Numerics;

namespace NumberToText
{
    class Program
    {
        public static string ConvertToText(ulong number)
        {
            if (number == 0)
            return "zero";

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

        string words = "";

        if ((number / 1000000) > 0)
        {
            words += ConvertToText(number / 1000000) + " million ";
            number %= 1000000;
        }

        if ((number / 1000) > 0)
        {
            words += ConvertToText(number / 1000) + " thousand ";
            number %= 1000;
        }

        if ((number / 100) > 0)
        {
            words += ConvertToText(number / 100) + " hundred ";
            number %= 100;
        }

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

            var units = new[] 
            { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
            var tens = new[] 
            { "zero", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" };

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

        return words;
        }

        static void Main(string[] args)
        {
            Write("Enter a number: ");
            var number = ReadLine();

            ConvertToText(number);
            
        }
    }
}

标签: c#stringbuilderdata-conversion

解决方案


错误 CS0121:以下方法或属性之间的调用不明确:“Math.Abs​​(decimal)”和“Math.Abs​​(float)”

第一个错误是告诉您没有Absulong参数的重载,并且它应该使用哪些候选者是模棱两可的(要么 要么decimalfloat

要解决此问题,您必须自己转换值。另请注意,您必须在将结果传递Absulong您的方法之前将结果转换为:

if (number < 0)
    return "minus " + ConvertToText((ulong) Math.Abs((decimal) number));

但是应该指出,aulong是一个无符号长整数,这意味着它永远不会是负数,因此不需要此检查。


错误 CS1503:参数 1:无法从“字符串”转换为“ulong”

第二个错误是告诉您没有从stringto的隐式转换ulong。为了解决这个问题,我们可以使用ulong.Parseor ulong.TryParse。由于不能保证输入是有效的ulong,我们应该使用TryParse这样我们可以添加一些错误处理,并让用户在输入无效输入时重试。

TryParse接受一个字符串参数和一个out将设置为转换值的参数,并返回一个bool指示转换是否成功的参数。所以我们可以像这样实现它:

Console.Write("Enter a number: ");
var input = Console.ReadLine();

ulong number;

while (!ulong.TryParse(input, out number))
{
    Console.ForegroundColor = ConsoleColor.Red;
    Console.Write("Invalid input, please try again: ");
    Console.ResetColor();
    input = Console.ReadLine();
}

string result = ConvertToText(number);

Console.WriteLine(result);

推荐阅读