"numeral": Printing the numeral string utility in C
hacker emblem Happy Hacking!


English Here (machine translation)

numeral: 整数を表す数字文字列を英語/米語の表記に変換するユーティリティ
real_numeral: 実数を表す数字文字列を英語/米語の表記に変換するユーティリティ

numeral() API は、整数を表す半角数字文字列を英語あるいは米語表記の半角英字文字列に変換します。
real_numeral() API は、実数を表す破格数字文字列を numeral() 同様にして半角英字文字列に変換します。

どちらの API も、変換できる整数の範囲は英語表記指定の場合、最大 198 桁 (負数では 199 桁) の数字列です。
米語表記指定の場合は、

-999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
から
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
までの最大 102 桁 (負数では 103 桁) の数字文字列を扱えることになります。

英語表記で変換後の文字列が最大になるのは、負符号 - の後に 7 を 198 桁続けた数字列で、
minus seven hundreds seventy seven duotrigintilliards seven hundreds seventy seven duotrigintillions seven hundreds seventy seven untrigintilliards seven hundreds seventy seven untrigintillions seven hundreds seventy seven trigintilliards seven hundreds seventy seven trigintillions seven hundreds seventy seven novemvigintilliards seven hundreds seventy seven novemvigintillions seven hundreds seventy seven octovigintilliards seven hundreds seventy seven octovigintillions seven hundreds seventy seven septenvigintilliards seven hundreds seventy seven septenvigintillions seven hundreds seventy seven sexvigintilliards seven hundreds seventy seven sexvigintillions seven hundreds seventy seven quinvigintilliards seven hundreds seventy seven quinvigintillions seven hundreds seventy seven quattuorvigintilliards seven hundreds seventy seven quattuorvigintillions seven hundreds seventy seven trevigintilliards seven hundreds seventy seven trevigintillions seven hundreds seventy seven duovigintilliards seven hundreds seventy seven duovigintillions seven hundreds seventy seven unvigintilliards seven hundreds seventy seven unvigintillions seven hundreds seventy seven vigintilliards seven hundreds seventy seven vigintillions seven hundreds seventy seven novemdecilliards seven hundreds seventy seven novemdecillions seven hundreds seventy seven octodecilliards seven hundreds seventy seven octodecillions seven hundreds seventy seven septendecilliards seven hundreds seventy seven septendecillions seven hundreds seventy seven sexdecilliards seven hundreds seventy seven sexdecillions seven hundreds seventy seven quindecilliards seven hundreds seventy seven quindecillions seven hundreds seventy seven quattuordecilliards seven hundreds seventy seven quattuordecillions seven hundreds seventy seven tredecilliards seven hundreds seventy seven tredecillions seven hundreds seventy seven duodecilliards seven hundreds seventy seven duodecillions seven hundreds seventy seven undecilliards seven hundreds seventy seven undecillions seven hundreds seventy seven decilliards seven hundreds seventy seven decillions seven hundreds seventy seven nonilliards seven hundreds seventy seven nonillions seven hundreds seventy seven octilliards seven hundreds seventy seven octillions seven hundreds seventy seven septilliards seven hundreds seventy seven septillions seven hundreds seventy seven sextilliards seven hundreds seventy seven sextillions seven hundreds seventy seven quintilliards seven hundreds seventy seven quintillions seven hundreds seventy seven quadrilliards seven hundreds seventy seven quadrillions seven hundreds seventy seven trilliards seven hundreds seventy seven trillions seven hundreds seventy seven billiards seven hundreds seventy seven billions seven hundreds seventy seven milliards seven hundreds seventy seven millions seven hundreds seventy seven thousands seven hundreds seventy seven
という文字列長 2913 バイトの半角英字文字列になります。
米語表記で変換後の文字列長が最長になるのは、

-7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
で、
minus seven hundreds seventy seven duotrigintillions seven hundreds seventy seven untrigintillions seven hundreds seventy seven trigintillions seven hundreds seventy seven novemvigintillions seven hundreds seventy seven octovigintillions seven hundreds seventy seven septenvigintillions seven hundreds seventy seven sexvigintillions seven hundreds seventy seven quinvigintillions seven hundreds seventy seven quattuorvigintillions seven hundreds seventy seven trevigintillions seven hundreds seventy seven duovigintillions seven hundreds seventy seven unvigintillions seven hundreds seventy seven vigintillions seven hundreds seventy seven novemdecillions seven hundreds seventy seven octodecillions seven hundreds seventy seven septendecillions seven hundreds seventy seven sexdecillions seven hundreds seventy seven quindecillions seven hundreds seventy seven quattuordecillions seven hundreds seventy seven tredecillions seven hundreds seventy seven duodecillions seven hundreds seventy seven undecillions seven hundreds seventy seven decillions seven hundreds seventy seven nonillions seven hundreds seventy seven octillions seven hundreds seventy seven septillions seven hundreds seventy seven sextillions seven hundreds seventy seven quintillions seven hundreds seventy seven quadrillions seven hundreds seventy seven trillions seven hundreds seventy seven billions seven hundreds seventy seven millions seven hundreds seventy seven thousands seven hundreds seventy seven
という文字列長 1477 バイトの半角英字文字列になります。real_numeral() は、この整数部の後に単語 "point" と小数部の各桁の英語/米語表記を続けて出力します。(例: "81.3" は "eighty one point three")

API を使用するためのヘッダは numeral.h で、API の実装は numeral.c です。API の説明は、この文書で後述しています。

テスト・プログラム numeral-test.c そして make ファイル Makefile を記述しました。テストは、

        $ make clean; make; make test
とコマンド実行することで行えます。

指数ごとの米語および英語表記は下表のようになります。

指数米語の表記英語の表記
10^195duotrigintilliard
10^192duotrigintillion
10^189untrigintilliard
10^186untrigintillion
10^183trigintilliard
10^180trigintillion
10^177novemvigintilliard
10^174novemvigintillion
10^171octovigintilliard
10^168octovigintillion
10^165septenvigintilliard
10^162septenvigintillion
10^159sexvigintilliard
10^156sexvigintillion
10^153quinvigintilliard
10^150quinvigintillion
10^147quattuorvigintilliard
10^144quattuorvigintillion
10^141trevigintilliard
10^138trevigintillion
10^135duovigintilliard
10^132duovigintillion
10^129unvigintilliard
10^126unvigintillion
10^123vigintilliard
10^120vigintillion
10^117novemdecilliard
10^114novemdecillion
10^111octodecilliard
10^108octodecillion
10^105septendecilliard
10^102septendecillion
10^100ten duotrigintillions (or googol)ten sexdecilliards
10^99duotrigintillionsexdecilliard
10^96untrigintillionsexdecillion
10^93trigintillionquindecilliard
10^90novemvigintillionquindecillion
10^87octovigintillionquattuordecilliard
10^84septenvigintillionquattuordecillion
10^81sexvigintilliontredecilliard
10^78quinvigintilliontredecillion
10^75quattuorvigintillionduodecilliard
10^72trevigintillionduodecillion
10^69duovigintillionundecilliard
10^66unvigintillionundecillion
10^63vigintilliondecilliard
10^60novemdecilliondecillion
10^57octodecillionnonilliard
10^54septendecillionnonillion
10^51sexdecillionoctilliard
10^48quindecillionoctillion
10^45quattuordecillionseptilliard
10^42tredecillionseptillion
10^39duodecillionsextilliard
10^36undecillionsextillion
10^33decillionquintilliard
10^30nonillion (or noventillion)quintillion
10^27octillionquadrilliard
10^24septillionquadrillion
10^21sextilliontrilliard
10^18quintilliontrillion
10^15quadrillionbilliard
10^12trillionbillion
10^9billionmilliard
10^6millionmillion
10^3thousandthousand
10^2hundredhundred

API の説明

  1. 整数を表す半角数字文字列を米語表記の半角英字文字列に変換する numeral()
    int numeral(char *src
    , char *dst
    , size_t sz
    , NUMERAL_REPRE_STYLE_t style
    );

    src には (符合を除いて) 英語表記指定時は最大 126 桁、米語表記指定時は最大 66 桁までの半角数字文字列 (ASCII コード) を渡します。
    dst には米語表記に変換した半角英字文字列を出力します。
    出力文字列の領域には英語表記の場合は最大 2913 文字が、米語表記の場合は最大 1491 文字が出力されます。
    sz には dst の指す出力領域のサイズを指定します。
    style には英語表記を指定する場合は NUMERAL_STYLE_ENGLISH を、米語表記を指定する場合は NUMERAL_STYLE_AMERICAN を指定します。

    戻り値は以下の意味を持ちます。

    • NUMERAL_NORMAL_END (= 0) : 正常終了
    • NUMERAL_ILLEGAL_ARGS (= 1) : 不正な引数を渡された場合
    • NUMERAL_BUFFER_OVERFLOW (= 2) : 整形結果が出力先のメモリ領域サイズを超過する場合

  2. 実数を表す半角数字文字列を米語表記の半角英字文字列に変換する real_numeral()
    int real_numeral(char *src
    , char *dst
    , size_t sz
    , NUMERAL_REPRE_STYLE_t style
    );

    src には実数を表す半角文字列を渡します。その文字列の整数部には、 (符合を除いて) 英語表記指定時は 126 桁、米語表記指定時は 66 桁までの桁数を許容します。
    dst には米語表記に変換した半角英字文字列を出力します。
    出力文字列の領域には英語表記の場合は最大 ((小数部桁数 + 1) * 6 + 2913) 文字が、米語表記の場合は最大 ((小数部桁数 + 1) * 6 + 1491) 文字が出力されます。
    sz には dst の指す出力領域のサイズを指定します。
    style には英語表記を指定する場合は NUMERAL_STYLE_ENGLISH を、米語表記を指定する場合は NUMERAL_STYLE_AMERICAN を指定します。

    戻り値は以下の意味を持ちます。

    • NUMERAL_NORMAL_END (= 0) : 正常終了
    • NUMERAL_ILLEGAL_ARGS (= 1) : 不正な引数を渡された場合
    • NUMERAL_BUFFER_OVERFLOW (= 2) : 整形結果が出力先のメモリ領域サイズを超過する場合