數值轉大寫
兩年前有陣子上Leetcode試玩了一下。 其中有一題Integer to Roman,
沒想到兩年多了還是維持在最快(3ms, 再快真的不容易)
程式碼如下:
class Solution { public String intToRoman(int num) { int[] nums = new int[]{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4}; String[] rns = new String[]{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV"}; StringBuilder sb = new StringBuilder(); int pos = 0; while (num > 3 && pos < rns.length) { int d = num / nums[pos]; int r = num % nums[pos]; if (d > 0) { for (int i = 0; i < d; i++) { sb.append(rns[pos]); } } else { pos++; } num = r; } while (num-- > 0) { sb.append('I'); } return sb.toString(); } }
不過這對於我們用中文的來說,比較實用的還是轉國字大寫
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
import java.util.regex.Pattern; | |
/** | |
* @author Kent Yeh | |
*/ | |
public class ZhBigNum { | |
public static final Pattern ZEROP = Pattern.compile("\\x{96F6}{2,}"); | |
public static void main(String[] args) { | |
System.out.println(toZhBigNum("1002000304050")); | |
System.out.println(toZhBigNum("305000")); | |
System.out.println(toZhBigNum("100020003000")); | |
} | |
public static String toZhBigNum(String value) { | |
char[] bd = new char[]{'零', '壹', '貳', '參', '肆', '伍', '陸', '柒', '捌', '玖'}; | |
String[] tail1 = new String[]{"", "拾", "佰", "仟"}; | |
String[] tail2 = new String[]{"", "萬", "億", "兆"}; | |
StringBuilder res = new StringBuilder(); | |
int pos = 0; | |
boolean fnz = false;//每4個一組,直到碰到不是0才為true | |
for (char c : new StringBuilder(value).reverse().toString().toCharArray()) { | |
int d = c; | |
int r = pos / 4; | |
int m = pos % 4; | |
boolean nz = c > 48; | |
fnz = m == 0 ? c > 48 : c > 48 || fnz; | |
res.append(nz ? tail2[r] : "").append(nz ? tail1[m] : "").append(fnz ? bd[d - 48] : ""); | |
if (nz) { | |
tail2[r] = ""; | |
} | |
pos++; | |
} | |
return ZEROP.matcher(res.reverse().toString()).replaceAll("零"); | |
} | |
public static String toZhBigNumFast(String value) { | |
char[] bd = new char[]{'零', '壹', '貳', '參', '肆', '伍', '陸', '柒', '捌', '玖'}; | |
String[] tail1 = new String[]{"", "拾", "佰", "仟"}; | |
String[] tail2 = new String[]{"", "萬", "億", "兆"}; | |
StringBuilder res = new StringBuilder(); | |
boolean fnz = false;//每4個一組,直到碰到不是0才為true | |
char[] cs = value.toCharArray(); | |
int len = cs.length; | |
for (int i = len - 1; i > -1; i--) { | |
int d = cs[i]; | |
int pos = len - i - 1; | |
int r = pos / 4; | |
int m = pos % 4; | |
boolean nz = d > 48; | |
fnz = m == 0 ? d > 48 : d > 48 || fnz; | |
res.append(nz ? tail2[r] : "").append(nz ? tail1[m] : "").append(fnz ? bd[d - 48] : ""); | |
if (nz) { | |
tail2[r] = ""; | |
} | |
} | |
return ZEROP.matcher(res.reverse().toString()).replaceAll("零"); | |
} | |
} |
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
function reverseString(str) { | |
return str.split('').reverse().join(''); | |
} | |
function toZhBigNum(snum){ | |
if(!snum||snum===0||snum==='零') | |
return '零'; | |
snum = ''+snum; | |
let bd = ['零', '壹', '貳', '參', '肆', '伍', '陸', '柒', '捌', '玖']; | |
let tail1=['', '拾', '佰', '仟']; | |
let tail2=['', '萬', '億', '兆']; | |
let fnz = false; | |
let len = snum.length; | |
let res = ''; | |
for (let i = len - 1; i > -1; i--) { | |
let d = snum.charCodeAt(i); | |
let pos = len - i - 1; | |
let r = Math.floor(pos / 4); | |
let m = pos % 4; | |
let nz = d > 48; | |
fnz = m == 0 ? d > 48 : d > 48 || fnz; | |
if(nz) | |
res = res + tail2[r] + tail1[m]; | |
if(fnz){ | |
res = res + bd[d - 48]; | |
} | |
if(nz) | |
tail2[r] = ''; | |
} | |
return reverseString(res).replace(/\u96F6{2,}/g, '零'); | |
} |
留言
張貼留言