Last active
September 19, 2018 11:51
-
-
Save nimzo6689/cd42f1e31ee4e364277abadbdc6bd6f6 to your computer and use it in GitHub Desktop.
数字の読み方を返すプログラム(PostgreSQL - PL/pgSQL)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- ※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