#始めに
値段の表記などの数値3桁ごとにカンマを入れる簡単な方法をみて、
「String#formatやNumberFormatを使わずに自前でカンマ区切りのロジックを書くとしたら、どのように実装するか」
ということに興味が湧いたので、簡単に実装してみました
#実装方針
正規表現で数値3桁の部分集合を取得して、reduceで折りたためばいい感じでできそうな気がする
tsubstringでちまちま切り出すと添え字の操作がめんどくさそう
文字数が3の倍数でないときは無理やり前ゼロを入れればよさそう
#実装してみた
MyFormatter.java
package formatter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MyFormatter {
public static void main(String[] args) throws Exception{
System.out.println(format("11"));
System.out.println(format("111"));
System.out.println(format("1111"));
System.out.println(format("11111"));
System.out.println(format("111111"));
}
public static String format(String str) {
Matcher matcher = Pattern.compile("(\\d{3})").matcher(makeStr(str));
List<String> strs =new ArrayList<String>();
//前0を除去する
if(matcher.find()) {
strs.add(Integer.parseInt(matcher.group()) + "");
}
while(matcher.find()) {
strs.add(matcher.group());
}
//,を付加するのはreduceを使ったほうがすっきりする
return strs
.stream()
.reduce((s,s1)-> s+","+s1)
.get();
}
public static String makeStr(String str) {
if(str.length()%3 ==2)return "0" + str;
else if(str.length()%3 ==1)return "00" + str;
else return str;
}
}
##実行結果
11
111
1,111
11,111
111,111
#感想
- Javaは正規表現で部分文字列を取得するのが面倒くさい、group関数がstreamを返してくれればいいのに
- このロジックは文字列を××文字ずつ切りだしたいとき、応用できそう