Skip to content

Instantly share code, notes, and snippets.

@nimzo6689
Last active September 19, 2018 11:51
Show Gist options
  • Save nimzo6689/cd42f1e31ee4e364277abadbdc6bd6f6 to your computer and use it in GitHub Desktop.
Save nimzo6689/cd42f1e31ee4e364277abadbdc6bd6f6 to your computer and use it in GitHub Desktop.
数字の読み方を返すプログラム(PostgreSQL - PL/pgSQL)
-- ※PL/pgSQLです。
CREATE OR REPLACE FUNCTION numerical_to_reading(numerical_value integer) RETURNS varchar AS $$
DECLARE
numerical_char CONSTANT varchar := abs(numerical_value)::varchar;
numerical_length CONSTANT integer := char_length(numerical_char);
digit integer;
currval integer;
ret varchar := '';
BEGIN
IF numerical_value = 0 THEN
-- 一桁の0の場合のみ「ぜろ」が読まれるため、すぐにRETURNで返す。
RETURN 'ぜろ';
ELSIF numerical_value < 0 THEN
-- マイナス符号の読み方を定義
ret := ret || 'まいなす';
END IF;
-- 整数部の読み方を求める
FOR i IN 1 .. numerical_length LOOP
digit := numerical_length - i + 1;
currval := substring(numerical_char FROM i FOR 1)::integer;
-- 数字の読み方を逐次解釈
-- 参考: https://www.coscom.co.jp/learnjapanese101/wordcategory/basicwords_numbers-c.html
CASE currval
WHEN 1 THEN
CASE digit % 4
WHEN 0 THEN
-- 1,000(いっせん)の読み方を定義
ret := ret || 'いっ';
WHEN 1 THEN
ret := ret || 'いち';
ELSE
-- 10, 100の場合は1自体は読まない。
NULL;
END CASE;
WHEN 2 THEN
ret := ret || 'に';
WHEN 3 THEN
ret := ret || 'さん';
WHEN 4 THEN
ret := ret || 'よん';
WHEN 5 THEN
ret := ret || 'ご';
WHEN 6 THEN
IF digit % 4 = 3 THEN
-- 6百(ろっぴゃく)の読み方を定義
ret := ret || 'ろっ';
ELSE
ret := ret || 'ろく';
END IF;
WHEN 7 THEN
ret := ret || 'なな';
WHEN 8 THEN
IF digit % 4 IN (3, 0) THEN
-- 8百(はっせん)、8千(はっせん)の読み方を定義
ret := ret || 'はっ';
ELSE
ret := ret || 'はち';
END IF;
WHEN 9 THEN
ret := ret || 'きゅう';
ELSE
NULL;
END CASE;
-- 1桁ごとの読み方を定義(一、十、百、千)
IF currval = 0 THEN
NULL;
ELSE
CASE digit % 4
WHEN 2 THEN
ret := ret || 'じゅう';
WHEN 3 THEN
IF currval = 3 THEN
-- 3百(さんびゃく)の読み方を定義
ret := ret || 'びゃく';
ELSIF currval IN (6, 8) THEN
-- 6百(ろっぴゃく)、8百(はっぴゃく)の読み方を定義
ret := ret || 'ぴゃく';
ELSE
ret := ret || 'ひゃく';
END IF;
WHEN 0 THEN
IF currval = 3 THEN
-- 3千(さんぜん)の読み方を定義
ret := ret || 'ぜん';
ELSE
ret := ret || 'せん';
END IF;
ELSE
NULL;
END CASE;
END IF;
-- 4桁ごとにつく単位の読み方を定義(万、億)※兆以降はサポート対象外
CASE digit
WHEN 5 THEN
ret := ret || 'まん';
WHEN 9 THEN
ret := ret || 'おく';
ELSE
NULL;
END CASE;
END LOOP;
RETURN ret;
END
$$ LANGUAGE plpgsql
IMMUTABLE
RETURNS NULL ON NULL INPUT;
VALUES
(0, numerical_to_reading(0)),
(-15056, numerical_to_reading(-15056)),
(10001000, numerical_to_reading(10001000)),
(58095165, numerical_to_reading(58095165)),
(418313801, numerical_to_reading(418313801))
;
-- 0 "ぜろ"
-- -15056 "まいなすいちまんごせんごじゅうろく"
-- 10001000 "いっせんまんいっせん"
-- 58095165 "ごせんはっぴゃくきゅうまんごせんひゃくろくじゅうご"
-- 418313801 "よんおくいっせんはっぴゃくさんじゅういちまんさんぜんはっぴゃくいち"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment