Например:
(1).SomeFunction().Equals("one")
(2).SomeFunction().Equals("two")
Мне действительно только нужен он для цифр 1-9 в случае, с которым я работаю, я должен просто использовать случай переключателя/выбора?
Обновление мне не будет нужна локализация в этом случае также.
Обновите 2, Вот то, что я закончил тем, что использовал:
Private Enum EnglishDigit As Integer
zero
one
two
three
four
five
six
seven
eight
nine
End Enum
(CType(someIntThatIsLessThanTen, EnglishDigit)).ToString()
Как насчет перечисления?
enum Number
{
One = 1, // default value for first enum element is 0, so we set = 1 here
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
}
Затем вы можете ввести что-то вроде ...
((Number)1).ToString()
Если вам нужна локализация, вы можете добавить DescriptionAttribute
к каждому значению перечисления. Свойство Описание
атрибута будет хранить имя ключа элемента ресурса.
enum Number
{
[Description("NumberName_1")]
One = 1, // default value for first enum element is 0, so we set = 1 here
[Description("NumberName_2")]
Two,
// and so on...
}
Следующая функция будет получать значение свойства Описание
из атрибута
public static string GetDescription(object value)
{
DescriptionAttribute[] attributes = null;
System.Reflection.FieldInfo fi = value.GetType().GetField(value.ToString());
if (fi != null)
{
attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
}
string description = null;
if ((attributes != null) && (attributes.Length > 0))
{
description = attributes[0].Description;
}
return description;
}
Это можно вызвать следующим образом:
GetDescription(((Number)1))
Отсюда вы можете извлечь соответствующее значение из ресурса. файл или просто вызовите .ToString ()
, если был возвращен null
.
Различные комментаторы указывали (и я должен согласиться), что было бы проще просто использовать имена значений перечисления для ссылки на локализованные строки.
создать словарь строк:
string[] digits = new string[]
{
"zero",
"one",
"two",
...
};
string word = digits[digit];
Использовать таблицу поиска; подойдет массив. Это не медленнее, чем перечисление, и его легче локализовать.
править
Образец кода Андрея - это то, что я предлагал, хотя я думаю, что называть его словарем немного сбивает с толку.
Если вам не нужна локализация, я бы предложил решение Ричарда Эва. Однако для локализации я бы предложил добавить десятизначные имена в файл ресурсов, например, NumberName_0
- NumberName_9
. Таким образом, при поиске числа можно просто загрузить ресурс с именем String.Format("NumberName_{0}", mydigit)
.
Эта же техника, кстати, отлично работает и для локализуемых имен перечислений или описаний.
Я не думаю, что есть встроенные функции для этого. Я бы использовал select case.
Если вы используете 2008:
public static String AsWord(this int aNumber) {
return ((Number) aNumber).ToString();
}
enum Number {
One = 1,
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
}
Зачем останавливаться на 1-9 ...
Вариант C # способа, которым Squeak Smalltalk делает это для всех чисел до бесконечности:
public static String AsWords(this int aNumber) {
var answer = "";
if (aNumber == 0) return "zero";
if (aNumber < 0) {
answer = "negative";
aNumber = Math.Abs(aNumber);
}
var thousands = new[] {"", "thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sextillion", "septillion","octillion", "nonillion", "decillion", "undecillion", "duodecillion", "tredecillion", "quattuordecillion", "quindecillion", "sexdecillion", "septendecillion", "octodecillion", "novemdecillion", "vigintillion"};
var thousandCount = 0;
while (aNumber > 0) {
var underOneThousandName = ThreeDigitName(aNumber % 1000);
aNumber = aNumber / 1000;
if(underOneThousandName != "") {
if (answer != "") answer = "," + answer;
answer = underOneThousandName + " " + thousands[thousandCount] + answer;
}
thousandCount += 1;
}
return answer;
}
private static string ThreeDigitName(int aNumberLessThanOneThousand) {
if (aNumberLessThanOneThousand == 0) return "";
var units = new[] {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eightteen", "nineteen"};
var answer = "";
if (aNumberLessThanOneThousand > 99) {
answer = units[(aNumberLessThanOneThousand / 100) - 1] + " hundred";
if (aNumberLessThanOneThousand % 100 != 0)
answer += " " + ThreeDigitName(aNumberLessThanOneThousand % 100);
return answer;
}
if (aNumberLessThanOneThousand < 20) return units[aNumberLessThanOneThousand -1];
var multiplesOfTen = new[] {"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
answer += multiplesOfTen[(aNumberLessThanOneThousand / 10)-2];
if (aNumberLessThanOneThousand % 10 != 0) answer += "-" + units[(aNumberLessThanOneThousand % 10)-1];
return answer;
}