2016-12-15 110 views
3

我試圖用文字轉換數字。Oracle:將數字轉換爲除英語以外的其他語言的文字

select to_char(to_date(:number,'j'),'jsp') from dual; 



SELECT TO_CHAR (TO_DATE (24834, 'j'), 'jsp') FROM DUAL; 
//Output: twenty-four thousand eight hundred thirty-four 

但問題是我需要轉換其他語言不是英文的數字。也許你有任何想法如何做到這一點?

我需要轉換成拉脫維亞語。

回答

2

這是一個很酷的技巧(JSP的形式採取了朱利安和拼寫出來)手冊。我發現了一個Ask Tom article,它提供了更多細節。但基本上,jsp格式只能用於英文,但可以將其包裝在一個函數中,並將英語翻譯爲另一種語言。

例如,湯姆的spell_number功能如下:

create or replace 
function spell_number(p_number in number) 
return varchar2 
as 
type myArray is table of varchar2(255); 
l_str myArray := myArray('', 
' thousand ', ' million ', 
' billion ', ' trillion ', 
' quadrillion ', ' quintillion ', 
' sextillion ', ' septillion ', 
' octillion ', ' nonillion ', 
' decillion ', ' undecillion ', 
' duodecillion '); 

l_num varchar2(50) default trunc(p_number); 
l_return varchar2(4000); 
begin 
for i in 1 .. l_str.count 
loop 
exit when l_num is null; 

if (substr(l_num, length(l_num)-2, 3) <> 0) 
then 
l_return := to_char( 
to_date( 
substr(l_num, length(l_num)-2, 3), 
'J'), 
'Jsp') || l_str(i) || l_return; 
end if; 
l_num := substr(l_num, 1, length(l_num)-3); 
end loop; 

return l_return; 
end; 
/

而對於一個版本法語(顯然)只是使用了一些法語翻譯spell_number:

create or replace 
function spell_number_french(p_number in number) 
return varchar2 
as 
begin 
return replace(replace(replace(replace(replace( 
replace(replace(replace(replace(replace( 
replace(replace(replace(replace(replace( 
replace(replace(replace(replace(replace( 
replace(replace(replace(replace(replace( 
replace(replace(replace(replace(replace( 
replace(replace(replace(replace(replace( 
replace(replace(replace(replace(replace( 
replace( 
lower(spell_number(p_number)) 
, 'duodecillion', 'bidecillion') 
, 'quintillion' , 'cintillion') 
, 'billion' , 'milliard') 
, 'thousand' , 'mille') 
, 'hundred' , 'cent') 
, 'ninety' , 'quatre-vingt-dix') 
, 'eighty' , 'quatre-vingt') 
, 'seventy' , 'soixante-dix') 
, 'sixty' , 'soixante') 
, 'fifty' , 'cinquante') 
, 'forty' , 'quarante') 
, 'thirty' , 'trente') 
, 'twenty' , 'vingt') 
, 'nineteen' , 'dix-neuf') 
, 'eighteen' , 'dix-huit') 
, 'seventeen' , 'dix-sept') 
, 'sixteen' , 'seize') 
, 'fifteen' , 'quinze') 
, 'fourteen' , 'quatorze') 
, 'thirteen' , 'treize') 
, 'twelve' , 'douze') 
, 'eleven' , 'onze') 
, 'ten' , 'dix') 
, 'nine' , 'neuf') 
, 'eight' , 'huit') 
, 'seven' , 'sept') 
, 'five' , 'cinq') 
, 'four' , 'quatre') 
, 'three' , 'trois') 
, 'two' , 'deux') 
, 'one' , 'un') 
, 'dix-six' , 'seize') 
, 'dix-cinq' , 'quinze') 
, 'dix-quatre' , 'quatorze') 
, 'dix-trois' , 'treize') 
, 'dix-deux' , 'douze') 
, 'dix-un' , 'onze') 
, '-un ' , '-une ') 
, 'un cent' , 'cent') 
, 'un mille' , 'mille') 
, 'une' , 'un'); 
end spell_number_french; 

做一些類似的語言的東西你的選擇。請參閱Ask Tom鏈接進行更詳細的討論。

0

是什麼?怎麼樣?

SELECT TO_CHAR (SYSDATE, 'DD/MON/YYYY', 
'nls_date_language=''Traditional Chinese'' ') FROM DUAL 

我不知道拉脫維亞語,你需要檢查一下所支持的語言

0

我能看到的唯一途徑是建立一個翻譯表,這個翻譯應用到字符串。 例如,假設你有這些翻譯:

create table translate (eng, lat) as 
(
select 'twenty', 'TWENTY' from dual union all 
select 'thousand', 'THOUSAND' from dual union all 
select 'eight', 'EIGHT' from dual union all 
select 'four',  'FOUR' from dual union all 
select 'hundred', 'HUNDRED' from dual union all 
select 'thirty', 'THIRTY' from dual 
) 

你可以嘗試:

with test(s) as (SELECT replace(TO_CHAR (TO_DATE (24834, 'j'), 'jsp'), '-', ' - ') FROM DUAL) 
select replace (listagg (nvl(lat, tk), ' ') within group (order by position), ' - ', '-') 
from (
     SELECT regexp_substr(s, '[^ ]+', 1, level) as tk, level as position 
      FROM test 
     CONNECT BY instr(s, ' ', 1, level - 1) > 0 
    ) tokens 
left outer join translate tr 
    on (tr.eng = tokens.tk) 
order by position 

這給:

TWENTY-FOUR THOUSAND EIGHT HUNDRED THIRTY-FOUR 

內部查詢是一個字符串分離器,以建立一個列表來自英文字符串的令牌;該字符串被認爲是由空格分隔的令牌列表。

外部部分只是加入這個標記列表來獲得翻譯,注意使用NVL來處理'-',我認爲這是一個標記。

replace首先用空格包裝'-'字符,這樣他們將被視爲分離的標記購買分離器,然後刪除添加的空格,恢復字符串的初始結構。

這樣你就不需要硬編碼你的翻譯,但你可以把它們作爲數據處理。

請注意,這裏假設英語和拉脫維亞在拼寫數字上的唯一區別是單個單詞,而不是結構(我無法檢查假設是否正確)。

+0

最後一段中的註釋非常重要。在某些語言中,名詞有「性別」(男性和女性),用於「百」和「千」等數字的詞語也沒有區別。不定性和定冠詞可能因不同性別而不同。所以可能是形成複數名詞的方式。簡單地說,將所有語言的單詞之間從英語翻譯爲另一種語言可能會失敗。 (也許甚至可以在美國英語和英語之間進行翻譯 - 即英式英語。) – mathguy

相關問題