通俗易懂的单词拼写问题 [英] Currency to words mispelling problems
问题描述
这是下面的代码,用于将数字转换为单词。到底是什么问题?一切都用英语写得很好,但在我的国家(罗马尼亚),有几个不同的拼写让我们在几个例子中说明清楚:
This is the code below for converting numbers to words. What is the exactly problem ? Everything is great in English but in my country (Romania) there is different spelling let's make that clear in a few examples :
Ex。 1-英语,一美元,一千,一百,两百,这就是您写
的方式罗马尼亚语,联合国美元,O mie,O suta,Doua Sute,Trei Sute,在单词上有一个复数形式,在英语,几乎在罗马尼亚,您会用到One来完成所有更改,而我不知道如何解决这种复数形式。谢谢
Ex. 1 - English, One dollar,One thousand, One hundred, Two hundred that's how you write Romanian, Un dollar, O mie, O suta, Doua Sute, Trei Sute, there is a plural changing on the words, In English you use One for everything almost in Romanian this changes and I don't know how to fix it this plural.Thank you
private static string[] _ones =
{
"",
"unu",
"doua",
"trei",
"patru",
"cinci",
"sase",
"sapte",
"opt",
"noua"
};
private static string[] _teens =
{
"zece",
"unsprezece",
"doisprezece",
"treisprezece",
"paisprezece",
"cincisprezece",
"saisprezece",
"saptisprezece",
"optsprezece",
"nouasprezece"
};
private static string[] _tens =
{
"",
"zece",
"douazeci",
"treizeci",
"patruzeci",
"cincizeci",
"saizeci",
"saptezeci",
"optzeci",
"nouazeci"
};
// US Nnumbering:
private static string[] _thousands =
{
"",
"mie",
"milion",
"miliard",
"trilion",
"catralion"
};
string digits, temp;
bool showThousands = false;
bool allZeros = true;
// Use StringBuilder to build result
StringBuilder builder = new StringBuilder();
// Convert integer portion of value to string
digits = ((long)value).ToString();
// Traverse characters in reverse order
for (int i = digits.Length - 1; i >= 0; i--)
{
int ndigit = (int)(digits[i] - '0');
int column = (digits.Length - (i + 1));
// Determine if ones, tens, or hundreds column
switch (column % 3)
{
case 0: // Ones position
showThousands = true;
if (i == 0)
{
// First digit in number (last in loop)
temp = String.Format("{0} ", _ones[ndigit]);
}
else if (digits[i - 1] == '1')
{
// This digit is part of "teen" value
temp = String.Format("{0} ", _teens[ndigit]);
// Skip tens position
i--;
}
else if (ndigit != 0)
{
// Any non-zero digit
temp = String.Format("{0} ", _ones[ndigit]);
}
else
{
// This digit is zero. If digit in tens and hundreds
// column are also zero, don't show "thousands"
temp = String.Empty;
// Test for non-zero digit in this grouping
if (digits[i - 1] != '0' || (i > 1 && digits[i - 2] != '0'))
showThousands = true;
else
showThousands = false;
}
// Show "thousands" if non-zero in grouping
if (showThousands)
{
if (column > 0)
{
temp = String.Format("{0}{1}{2}",
temp,
_thousands[column / 3],
allZeros ? " " : ", ");
}
// Indicate non-zero digit encountered
allZeros = false;
}
builder.Insert(0, temp);
break;
case 1: // Tens column
if (ndigit > 0)
{
temp = String.Format("{0}{1}",
_tens[ndigit],
(digits[i + 1] != '0') ? " si " : " ");
builder.Insert(0, temp);
}
break;
case 2: // Hundreds column
if (ndigit > 0)
{
temp = String.Format("{0} sute ", _ones[ndigit]);
builder.Insert(0, temp);
}
break;
}
}
builder.AppendFormat("lei si {0:00} bani", (value - (long)value) * 100);
// Capitalize first letter
return String.Format("{0}{1}",
Char.ToUpper(builder[0]),
builder.ToString(1, builder.Length - 1));
推荐答案
您已经说过,只有两种可能的条件成千上万:
You've stated there are only 2 possible conditions for hundreds and thousands:
数百:1 = suta /大于1 = sute
Hundreds: 1 = suta / more than 1 = sute
千:1 = mie /大于1 = mii
Thousands: 1 = mie / more than 1 = mii
在两种情况下,如果为单数,则为 o;使用 Unu代替 unu。表示一个
In both cases, if singular, then "o" is used instead of "unu" to mean "one"
基于此,您可以轻松地在代码中添加正确的条件。
Based on this you can easily add the right conditions in the code.
我个人将重构该代码,但是由于这不是重点,因此我为您提供了一个解决方案。
I personally would refactor this code but since that's not the point here, I've included a solution for you.
数百个:
而不是
case 2: // Hundreds column
if (ndigit > 0)
{
temp = String.Format("{0} sute ", _ones[ndigit]);
builder.Insert(0, temp);
}
添加条件以检查数字并使用sute或suta:
Add the condition to check on digit and use sute or suta:
case 2: // Hundreds column
if (ndigit > 0)
{
temp = String.Format("{0} {1} ", ndigit == 1 ? "o" : _ones[ndigit], ndigit == 1 ? "suta" : "sute");
builder.Insert(0, temp);
}
数千
...
// Show "thousands" if non-zero in grouping
if (showThousands)
{
if (column > 0)
{
temp = String.Format("{0}{1}{2}",
temp,
_thousands[column / 3],
allZeros ? " " : ", ");
}
// Indicate non-zero digit encountered
allZeros = false;
}
应为:
// Show "thousands" if non-zero in grouping
if (showThousands)
{
if (column > 0)
{
bool isFirstThoussand = _thousands[column / 3] == _thousands[1] && ndigit == 1;
temp = String.Format("{0}{1}{2}",
isFirstThoussand ? "o " : temp,
isFirstThoussand ? _thousands[1] : "mii",
allZeros ? " " : ", ");
}
// Indicate non-zero digit encountered
allZeros = false;
}
...
这将产生所需的结果
这是您的整个代码(包含此答案的更新)和一些测试内容:
Here's your whole code (with the updates from this answer) and some test stuff:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RomanianNumberToWords
{
class Program
{
private static string[] _ones =
{
"",
"unu",
"doua",
"trei",
"patru",
"cinci",
"sase",
"sapte",
"opt",
"noua"
};
private static string[] _teens =
{
"zece",
"unsprezece",
"doisprezece",
"treisprezece",
"paisprezece",
"cincisprezece",
"saisprezece",
"saptisprezece",
"optsprezece",
"nouasprezece"
};
private static string[] _tens =
{
"",
"zece",
"douazeci",
"treizeci",
"patruzeci",
"cincizeci",
"saizeci",
"saptezeci",
"optzeci",
"nouazeci"
};
// US Nnumbering:
private static string[] _thousands =
{
"",
"mie",
"milion",
"miliard",
"trilion",
"catralion"
};
static string MakeWordFromNumbers(decimal value)
{
string digits, temp;
bool showThousands = false;
bool allZeros = true;
// Use StringBuilder to build result
StringBuilder builder = new StringBuilder();
// Convert integer portion of value to string
digits = ((long)value).ToString();
// Traverse characters in reverse order
for (int i = digits.Length - 1; i >= 0; i--)
{
int ndigit = (int)(digits[i] - '0');
int column = (digits.Length - (i + 1));
// Determine if ones, tens, or hundreds column
switch (column % 3)
{
case 0: // Ones position
showThousands = true;
if (i == 0)
{
// First digit in number (last in loop)
temp = String.Format("{0} ", _ones[ndigit]);
}
else if (digits[i - 1] == '1')
{
// This digit is part of "teen" value
temp = String.Format("{0} ", _teens[ndigit]);
// Skip tens position
i--;
}
else if (ndigit != 0)
{
// Any non-zero digit
temp = String.Format("{0} ", _ones[ndigit]);
}
else
{
// This digit is zero. If digit in tens and hundreds
// column are also zero, don't show "thousands"
temp = String.Empty;
// Test for non-zero digit in this grouping
if (digits[i - 1] != '0' || (i > 1 && digits[i - 2] != '0'))
showThousands = true;
else
showThousands = false;
}
// Show "thousands" if non-zero in grouping
if (showThousands)
{
if (column > 0)
{
bool isFirstThoussand = _thousands[column / 3] == _thousands[1] && ndigit == 1;
temp = String.Format("{0}{1}{2}",
isFirstThoussand ? "o " : temp,
isFirstThoussand ? _thousands[1] : "mii",
allZeros ? " " : ", ");
}
// Indicate non-zero digit encountered
allZeros = false;
}
builder.Insert(0, temp);
break;
case 1: // Tens column
if (ndigit > 0)
{
temp = String.Format("{0}{1}",
_tens[ndigit],
(digits[i + 1] != '0') ? " si " : " ");
builder.Insert(0, temp);
}
break;
case 2: // Hundreds column
if (ndigit > 0)
{
temp = String.Format("{0} {1} ", ndigit == 1 ? "o" : _ones[ndigit], ndigit == 1 ? "suta" : "sute");
builder.Insert(0, temp);
}
break;
}
}
// You always need "lei" right?
builder.AppendFormat("lei");
// This code simply divides the decimal value by 1; and only adds "si NN bani" if there's a remainder
if (Decimal.Remainder(value, 1) > 0) {
builder.AppendFormat(" si {0:00} bani", (value - (long)value) * 100);
}
// Capitalize first letter
return String.Format("{0}{1}",
Char.ToUpper(builder[0]),
builder.ToString(1, builder.Length - 1));
}
static void Main(string[] args)
{
Console.WriteLine(MakeWordFromNumbers(1127.00M));
Console.WriteLine(MakeWordFromNumbers(2227.00M));
Console.WriteLine(MakeWordFromNumbers(127.00M));
Console.WriteLine(MakeWordFromNumbers(227.00M));
Console.ReadKey();
}
}
}
这篇关于通俗易懂的单词拼写问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!