On May 2, 2006, at 5:54 AM, Steve wrote:

Hello all,
This is prolly a little offtopic, but I'm wondering if anyone can
recommend a good quick method of converting numbers to text.

I suck at C, but here's a stab at it...

[EMAIL PROTECTED]:~$ ./count 1 15 100 393 1938 91283 4918239 2147483647
1: one
15: fifteen
100: one hundred
393: three hundred ninety-three
1938: one thousand nine hundred thirty-eight
91283: ninety-one thousand two hundred eighty-three
4918239: four million nine hundred eighteen thousand two hundred thirty-nine 2147483647: two billion one hundred forty-seven million four hundred eighty-three thousand six hundred forty-seven


// ------------------------------------
// to compile: gcc -lm -o count count.c

#include <stdio.h>
#include <math.h>

const char *num[13]={"zero","one","two","three","four","five","six",
                      "seven","eight","nine","ten","eleven","twelve"};
const char *dim[10]={"","teen","twen","thir","for","fif","six","seven",
                     "eigh","nine"};
const char *pwr[4]={"hundred", "thousand", "million", "billion" };

int main(int argc, char **argv) {
  int i;
  for (i=1; i < argc; ++i) {
    long work = atoi(argv[i]);
    char words[256] = "";
    stringify(work, words);
    printf("%ld: %s\n", work, &words);
  }
}

stringify(long work, char *retval) {
  if (work > 99) {
    long power;
    for (power=9; power>-1; power-=3) {
      long e = (long)pow(10.0, (double)(power > 0 ? power : 2));
      if (work >= e) {
        long remainder = work % e;
        long coefficient = (work - remainder) / e;
        char coefficient_string[256] = "";
        char remainder_string[256] = "";
        stringify(coefficient, coefficient_string);
        if (remainder > 0) stringify(remainder, remainder_string);
        sprintf(retval, "%s %s %s", coefficient_string,
                pwr[power/3], remainder_string);
        break;
      }
    }
  }
  else if (work > 19) {
    if (work%10 == 0) sprintf(retval, "%sty", dim[work/10]);
    else sprintf(retval, "%sty-%s", dim[work/10], num[work%10]);
  }
  else if (work >12) {
    long j = work%10;
sprintf(retval, "%s%s", j==3 || j==5 || j==8 ? dim[j] : num[j], dim[1]);
  }
  else sprintf(retval, "%s", num[work]);
}

Attachment: smime.p7s
Description: S/MIME cryptographic signature

/*
PLUG: http://plug.org, #utah on irc.freenode.net
Unsubscribe: http://plug.org/mailman/options/plug
Don't fear the penguin.
*/

Reply via email to