※当サイトの記事には、広告・プロモーションが含まれます。

Javaで全角数字の判定どうするか調べてみた

internet.watch.impress.co.jp

⇧ Oh, my gosh...

Javaで全角数字の判定どうするか調べてみた

数字(numbers)と数値(numrical values)の違いについて考えて、

  • 数字(numbers)
    半角数字、全角数字
  • 数値(numrical values)
    半角数字

の違いなのかなと思い、そういえば、Javaで全角数字の判定どうするんだろうと思ったので、調べてみたところ、

半角数字と全角数字の両方を許容する判定は、

dimzakki.com

Javaの標準APIで用意されてるようなのですが、

write-remember.com

fumidzuki.com

⇧ 全角数字かどうかは、文字コードで判定する感じになるんですかね。

okwave.jp

正規表現でもいけるらしい。

Javaで全角数字の判定を試してみた

というわけで、試してみました。

■/test-java/src/CheckFullWidthNumbers.java

import java.util.Objects;

public class CheckFullWidthNumbers {

	public static void main(String[] args) {
		// 検証用データ
		String[] targetNumbersArr = {
				"1234567890",
				"1234567890",
				"1234567890",
				"",
				null,
				"一二三四五六七八九〇",
				"ⅠⅡⅢⅣⅤⅥⅦⅧⅨ"
		};
		
		System.out.println("■isFullWidthNumbers");
		for (String targetNumbers: targetNumbersArr) {
			if (isNumbers(targetNumbers)) {
				if (isFullWidthNumbers(targetNumbers)) {
					System.out.println(true);
				} else {
					System.out.println(false);
				}
			} else {
				System.out.println(false);
			}
		}
		
		System.out.println("■isFullWidthNumbersByOneByOne");		
		for (String targetNumbers: targetNumbersArr) {
			if (isNumbers(targetNumbers)) {
				if (isFullWidthNumbersByOneByOne(targetNumbers)) {
					System.out.println(true);
				} else {
					System.out.println(false);
				}
			} else {
				System.out.println(false);
			}		
		}
	}
	
	// 数字(全角数字、半角数字のどちらも。漢数字などは除く)か判定
	private static boolean isNumbers(String strNumbers) {
		if (Objects.isNull(strNumbers) || strNumbers.isEmpty()) {
			return false;
		}
		return strNumbers.chars().allMatch(targetcahr -> Character.isDigit(targetcahr));
	}
	
	// 全角数字のみ許容
	private static boolean isFullWidthNumbers(String strNumbers) {
		if (Objects.isNull(strNumbers) || strNumbers.isEmpty()) {
			return false;
		}
		if (strNumbers.matches("^[-]?[0-9]*[.]?[0-9]*")) {
			return true;
		}
		return false;
	}
	
	// 全角数字飲み許容
	private static boolean isFullWidthNumbersByOneByOne(String strNumbers) {
		if (Objects.isNull(strNumbers) || strNumbers.isEmpty()) {
			return false;
		}
		StringBuilder sb = new StringBuilder(strNumbers);
	    for (int i = 0; i < sb.length(); i++) {
	        int c = (int) sb.charAt(i);
	        if (c >= 0xFF10 && c <= 0xFF19) {
	            continue;
	        } else {
	        	return false;
	        }
	    }
	    return true;
	}

}

で実行したところ、

全角数字だけ許容してるので、半角数字と全角数字が混在してるものもfalse扱いになりました。

全角数字を扱うことは稀だとは思うけど...

endeavour.cocolog-nifty.com

⇧ 上記サイト様を参考に数字文字列を数値に変換も実装してみました。

import java.util.Objects;

public class CheckFullWidthNumbers {

	public static void main(String[] args) {
		// 検証用データ
		String[] targetNumbersArr = {
				"1234567890",
				"1234567890",
				"1234567890",
				"",
				null,
				"一二三四五六七八九〇",
				"ⅠⅡⅢⅣⅤⅥⅦⅧⅨ"
		};
		
		System.out.println("■isFullWidthNumbers");
		for (String targetNumbers: targetNumbersArr) {
			// 数字
			if (isNumbers(targetNumbers)) {
				// 全角数字
				if (isFullWidthNumbers(targetNumbers)) {
					System.out.println(true);
					System.out.println(targetNumbers + ": " +convertNumericFromString(targetNumbers));
				// 半角数字
				} else if (isHalfWidthNumbers(targetNumbers)){
					System.out.println(false);					
					System.out.println(targetNumbers + ": " +convertNumericFromString(targetNumbers));
				} else {
					System.out.println(false);
					System.out.println(targetNumbers + ": " +convertNumericFromString(targetNumbers));
				}

			} else {
				System.out.println(false);
			}
		}
		
		System.out.println("■isFullWidthNumbersByOneByOne");		
		for (String targetNumbers: targetNumbersArr) {
			// 数字
			if (isNumbers(targetNumbers)) {
				// 全角数字
				if (isFullWidthNumbersByOneByOne(targetNumbers)) {
					System.out.println(true);
					System.out.println(targetNumbers + ": " +convertNumericFromString(targetNumbers));
			    // 半角数字
				} else if (isHalfWidthNumbers(targetNumbers)) {
					System.out.println(false);
					System.out.println(targetNumbers + ": " +convertNumericFromString(targetNumbers));
				} else  {
					System.out.println(false);
					System.out.println(targetNumbers + ": " +convertNumericFromString(targetNumbers));
				}
			} else {
				System.out.println(false);
			}		
		}
	}
	
	// 数字かチェック
	private static boolean isNumbers(String strNumbers) {
		if (Objects.isNull(strNumbers) || strNumbers.isEmpty()) {
			return false;
		}
		return strNumbers.chars().allMatch(targetcahr -> Character.isDigit(targetcahr));
	}
	
	// 全角数字かチェック
	private static boolean isFullWidthNumbers(String strNumbers) {
		if (Objects.isNull(strNumbers) || strNumbers.isEmpty()) {
			return false;
		}
		if (strNumbers.matches("^[-]?[0-9]*[.]?[0-9]*")) {
			return true;
		}
		return false;
	}
	
	// 半角数字かチェック
	private static boolean isHalfWidthNumbers(String strNumbers) {
		if (Objects.isNull(strNumbers) || strNumbers.isEmpty()) {
			return false;
		}
		if (strNumbers.matches("^[0-9]+$")) {
			return true;
		}
		return false;
	}
	
	// 全角数字かチェック
	private static boolean isFullWidthNumbersByOneByOne(String strNumbers) {
		if (Objects.isNull(strNumbers) || strNumbers.isEmpty()) {
			return false;
		}
		StringBuilder sb = new StringBuilder(strNumbers);
	    for (int i = 0; i < sb.length(); i++) {
	        int c = (int) sb.charAt(i);
	        if (c >= 0xFF10 && c <= 0xFF19) {
	            continue;
	        } else {
	        	return false;
	        }
	    }
	    return true;
	}

	// 数字から数値へ変換
	private static Integer convertNumericFromString (String strNumbers) throws NumberFormatException {
		if (Objects.isNull(strNumbers) || strNumbers.isEmpty()) {
			return null;
		}		
		StringBuilder sb = new StringBuilder();
		char[] charArr = strNumbers.toCharArray();
		for (char numChar: charArr) {
			sb.append(Character.digit(numChar, 10));
		}
		return Integer.valueOf(sb.toString());
	}
	
}

今回はこのへんで。