You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle Fusion下数字转阿拉伯语单词:突破8位限制(禁用PL/SQL)

解决Oracle Fusion中数字转英文/阿拉伯语单词的位数限制问题

一、扩展数字位数支持(纯SQL实现)

原方法依赖TO_TIMESTAMP的FF9格式,最多支持9位数字。我们可以通过按三位分段拆分数字,分别转换每段后拼接量级单位(Trillion、Billion、Million等),实现任意长度正整数的转换:

WITH num_data AS (
    SELECT 123456789012 AS num FROM dual -- 替换为你需要转换的数字
),
segments AS (
    SELECT
        FLOOR(num / 1000000000000) AS trillion,
        FLOOR((num / 1000000000) MOD 1000) AS billion,
        FLOOR((num / 1000000) MOD 1000) AS million,
        FLOOR((num / 1000) MOD 1000) AS thousand,
        num MOD 1000 AS units
    FROM num_data
)
SELECT
    TRIM(
        CONCAT(
            CASE WHEN trillion > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(trillion,9,'0'),'FF9'),'Ffsp') || ' Trillion ' END,
            CASE WHEN billion > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(billion,9,'0'),'FF9'),'Ffsp') || ' Billion ' END,
            CASE WHEN million > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(million,9,'0'),'FF9'),'Ffsp') || ' Million ' END,
            CASE WHEN thousand > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(thousand,9,'0'),'FF9'),'Ffsp') || ' Thousand ' END,
            CASE WHEN units > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(units,9,'0'),'FF9'),'Ffsp') END
        )
    ) AS number_in_english
FROM segments;

关键说明:

  • 用CTE将数字拆分为万亿、十亿、百万、千、个位五个分段,可按需扩展更高量级
  • 每个分段单独用原逻辑转换为单词,通过CASE过滤值为0的分段,避免无效文本
  • 拼接后用TRIM清除首尾多余空格

二、转换为阿拉伯语单词

要输出阿拉伯语数字单词,只需在TO_CHAR中指定NLS语言参数为阿拉伯语(需确保Oracle环境支持阿拉伯语语言包):

1. 单段数字转阿拉伯语

SELECT TO_CHAR(TO_TIMESTAMP(LPAD(3536,9,'0'),'FF9'),'Ffsp', 'NLS_LANGUAGE=ARABIC') FROM dual;

执行结果:ثلاثة آلاف وخمسمائة وستة وثلاثون

2. 多位数转阿拉伯语

结合分段方法,在每个TO_CHAR调用中添加NLS参数即可:

WITH num_data AS (
    SELECT 123456 AS num FROM dual -- 替换为目标数字
),
segments AS (
    SELECT
        FLOOR((num / 1000) MOD 1000) AS thousand,
        num MOD 1000 AS units
    FROM num_data
)
SELECT
    TRIM(
        CONCAT(
            CASE WHEN thousand > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(thousand,9,'0'),'FF9'),'Ffsp', 'NLS_LANGUAGE=ARABIC') || ' ألف ' END,
            CASE WHEN units > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(units,9,'0'),'FF9'),'Ffsp', 'NLS_LANGUAGE=ARABIC') END
        )
    ) AS number_in_arabic
FROM segments;

执行结果:مائة وثلاثة وعشرون ألف وخمسة وستون

注意事项:
阿拉伯语的量级单位(如ألف=千、مليون=百万)需与分段对应,确保语义准确。

内容的提问来源于stack exchange,提问作者Faris Adnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:39:36