2010-04-28 3 views
51

Можно создать дубликат:
How can I convert an integer into its verbal representation?преобразования чисел и слов C#

Может кто-нибудь дать мне код праймера я мог бы работать на в преобразовании чисел в слова?

Преобразование чисел в слова (в диапазоне от -1000 до +1000) например: 1000 -> тысяча

+15

звучит как домашнее задание –

+0

Как в преобразовании чисел в строки? Или преобразование чисел в представления слов этого числа, например. 2030 = две тысячи тридцать? – froadie

+0

Вы сделали поиск в первую очередь?=/ – Jens

ответ

-5

Вам действительно нужно предоставить более подробную информацию относительно того, что вы имеете в виду. Вы имеете в виду «слова» или «строки»?

Например, если вы хотите, чтобы преобразовать число в строку, то вам нужно только что-то вроде этого:

int i = 123; 
string text = i.ToString(); 

В самом деле, вы даже можете сделать это:

(123).ToString(); // u need to put number in parenthesis 

и даже

(123.5).ToString(); // this always trips me out 

Однако, если вам нужно конвертировать 123 в one hundred twenty three, то вам нужно сделать больше разбора. Вам придется разбить номер на свои части, например сотни, десятые и т. Д.

Вы можете начать с получения длины строки (для ints), чтобы выяснить, где начать сбой. Например, 123 имеет 3 цифры, поэтому пусть N = 3 и i = 1. Затем вы начнете с деления 123 на 10 (Ni) или 100. Это дает вам 1. Теперь вы знаете, что слово начнется с «одного сто». Затем добавьте i, вычтите это число (100) и разделите на 10 (N-i) или 10 - это даст вам 2. Сделайте это до N == i.

Надеюсь, это поможет. Вы должны действительно изменить свой вопрос.

+0

@Juan: Хорошо, теперь я вижу, что вы редактировали свой вопрос. Я думаю, что мой ответ заставит вас идти в правильном направлении. – Dave

+0

, но есть проблема. Например, если у вас есть номера с 5 цифрами или 6 цифрами, ... ваш метод не работает. Например, 12341 в этом номере у нас должно быть двенадцать тысяч и ... но ваш метод не может сказать двенадцать тысяч. – Martin

+0

@Martin True. Но уже есть лучший ответ. – Dave

1

Когда мне пришлось решить эту проблему, я создал словарь с жесткими закодированными данными для сопоставления между числами и их ассоциированными словами. Например, следующий может представлять несколько записей в словаре:

{1, "one"} 
{2, "two"} 
{30, "thirty"} 

Вам действительно нужно только беспокоиться о числах отображения в 10^0 (1,2,3 и т.д.) и 10^1 (10,20,30), потому что, как только вы доберетесь до 100, вы просто должны знать, когда использовать слова, такие как сто, тысяча, миллион и т. Д. В сочетании с вашей картой. Например, если у вас есть номер, как 3,240,123, вы получите: три миллиона два сто сорок один сто двадцать три .

После того, как вы построите свою карту, вам нужно проработать каждую цифру в своем номере и выяснить подходящую номенклатуру, чтобы пойти с ней.

161
public static string NumberToWords(int number) 
{ 
    if (number == 0) 
     return "zero"; 

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

    string words = ""; 

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

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

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

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

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

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

    return words; 
} 
+0

сделал это аккуратным методом расширения, если вы не возражаете. – nawfal

+0

@nawfal: рекурсия в NumberToWords неверна после редактирования. –

+3

@tomp Я откатился к предыдущей версии, не потому, что я не мог исправить эту опечатку, но что метод расширения для int для этого не выглядит красивым .. – nawfal

Смежные вопросы