如何将 ulong 数据类型输入转换为用于口头数字输出的字符串?
How would I convert a ulong data type input to a string for verbal number output?
我目前正尝试在 C# 中创建一个应用程序,该应用程序接受 ulong
数字输入并输出数字的口头表示(即 12 到“十二”,45238 到“四万五千二百三十八”等),我希望它能够通过 uLong.MaxValue
.
我是编程新手,对这个概念真的很吃力。我之前曾尝试实现列表和 StringBuilder
,因为我认为它们可能有用,但我无法弄清楚。我正在尝试调整基本代码,使其适用于 ulong
数据类型,但出现以下错误:
error CS0121: The call is ambiguous between the following methods or
properties: 'Math.Abs(decimal)' and 'Math.Abs(float)' error CS1503:
Argument 1: cannot convert from 'string' to '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);
}
}
}
error CS0121: The call is ambiguous between the following methods or properties: 'Math.Abs(decimal)' and 'Math.Abs(float)'
第一个错误告诉您 Abs
没有重载,它接受 ulong
参数,并且它应该使用哪个候选者是不明确的(decimal
或 float
).
要解决这个问题,您必须自己转换值。另请注意,在将结果传递给您的方法之前,您必须将 Abs
的结果转换回 ulong
:
if (number < 0)
return "minus " + ConvertToText((ulong) Math.Abs((decimal) number));
不过需要指出的是,ulong
是一个 unsigned 长整数,这意味着它永远不会为负数,因此不需要进行此检查。
error CS1503: Argument 1: cannot convert from 'string' to 'ulong'
第二个错误告诉您没有从 string
到 ulong
的隐式转换。为了解决这个问题,我们可以使用ulong.Parse
或ulong.TryParse
。由于不能保证输入是有效的 ulong
,我们应该使用 TryParse
,这样我们可以添加一些错误处理,让用户在输入无效输入时重试。
TryParse
接受一个字符串参数和一个将被设置为转换值的 out
参数,它 returns 一个 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);
我目前正尝试在 C# 中创建一个应用程序,该应用程序接受 ulong
数字输入并输出数字的口头表示(即 12 到“十二”,45238 到“四万五千二百三十八”等),我希望它能够通过 uLong.MaxValue
.
我是编程新手,对这个概念真的很吃力。我之前曾尝试实现列表和 StringBuilder
,因为我认为它们可能有用,但我无法弄清楚。我正在尝试调整基本代码,使其适用于 ulong
数据类型,但出现以下错误:
error CS0121: The call is ambiguous between the following methods or properties: 'Math.Abs(decimal)' and 'Math.Abs(float)' error CS1503: Argument 1: cannot convert from 'string' to '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);
}
}
}
error CS0121: The call is ambiguous between the following methods or properties: 'Math.Abs(decimal)' and 'Math.Abs(float)'
第一个错误告诉您 Abs
没有重载,它接受 ulong
参数,并且它应该使用哪个候选者是不明确的(decimal
或 float
).
要解决这个问题,您必须自己转换值。另请注意,在将结果传递给您的方法之前,您必须将 Abs
的结果转换回 ulong
:
if (number < 0)
return "minus " + ConvertToText((ulong) Math.Abs((decimal) number));
不过需要指出的是,ulong
是一个 unsigned 长整数,这意味着它永远不会为负数,因此不需要进行此检查。
error CS1503: Argument 1: cannot convert from 'string' to 'ulong'
第二个错误告诉您没有从 string
到 ulong
的隐式转换。为了解决这个问题,我们可以使用ulong.Parse
或ulong.TryParse
。由于不能保证输入是有效的 ulong
,我们应该使用 TryParse
,这样我们可以添加一些错误处理,让用户在输入无效输入时重试。
TryParse
接受一个字符串参数和一个将被设置为转换值的 out
参数,它 returns 一个 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);