0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Java:自前でカンマ区切りのフォーマッタを実装してみる

Posted at

#始めに
値段の表記などの数値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を返してくれればいいのに
  • このロジックは文字列を××文字ずつ切りだしたいとき、応用できそう
0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?