Существует ли путь в .NET для получения строкового значения для слова интервала?

Например:

(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()
7
задан Richard Everett 29 March 2010 в 19:16
поделиться

7 ответов

Как насчет перечисления?

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 .

Править

Различные комментаторы указывали (и я должен согласиться), что было бы проще просто использовать имена значений перечисления для ссылки на локализованные строки.

11
ответ дан 6 December 2019 в 10:49
поделиться

создать словарь строк:

string[] digits = new string[] 
{
   "zero",
   "one",
   "two",
   ...
};

string word = digits[digit];
4
ответ дан 6 December 2019 в 10:49
поделиться

Использовать таблицу поиска; подойдет массив. Это не медленнее, чем перечисление, и его легче локализовать.

править

Образец кода Андрея - это то, что я предлагал, хотя я думаю, что называть его словарем немного сбивает с толку.

1
ответ дан 6 December 2019 в 10:49
поделиться

Если вам не нужна локализация, я бы предложил решение Ричарда Эва. Однако для локализации я бы предложил добавить десятизначные имена в файл ресурсов, например, NumberName_0 - NumberName_9. Таким образом, при поиске числа можно просто загрузить ресурс с именем String.Format("NumberName_{0}", mydigit).

Эта же техника, кстати, отлично работает и для локализуемых имен перечислений или описаний.

1
ответ дан 6 December 2019 в 10:49
поделиться

Я не думаю, что есть встроенные функции для этого. Я бы использовал select case.

0
ответ дан 6 December 2019 в 10:49
поделиться

Если вы используете 2008:

public static String AsWord(this int aNumber) {
    return ((Number) aNumber).ToString();
}

enum Number {
    One = 1,
    Two,
    Three,
    Four,
    Five,
    Six,
    Seven,
    Eight,
    Nine,
}
0
ответ дан 6 December 2019 в 10:49
поделиться

Зачем останавливаться на 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;
    }
1
ответ дан 6 December 2019 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: