package com.levelup.java.number;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.text.NumberFormat;
import java.text.ParseException;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.junit.Test;

import com.google.common.primitives.Doubles;

/**
 * This java example will demonstrate 
 * checking if a string is a number.
 * 
 * @author Justin Musgrove
 * @see <a href='http://www.leveluplunch.com/java/examples/is-string-numeric/'>Is string numeric</a>
 * 
 */
public class IsStringANumber {
	
	@Test
	public void is_string_a_number_java () {

		boolean isANumber = false;
		String numberString = "1234.54";

		try {
			Double.parseDouble(numberString);
			isANumber = true;
		} catch (NumberFormatException nfe) {
			// do nothing
		}
		assertTrue(isANumber);
	}

	@Test
	public void is_string_a_number_numberformat_java ()  {

		boolean isANumber = true;
		String numberString = "1234.54";

		try {
		    NumberFormat.getInstance().parse(numberString);
		} catch (ParseException nfe) {
			isANumber = false;
		}
		assertTrue(isANumber);
	}

	
	@Test
	public void is_string_a_number_java_with_char_array () {

		boolean isANumber = true;
		String numberString = "1234";
		
		for (char c : numberString.toCharArray()) {
	        if (!Character.isDigit(c)) {
	        	isANumber = false;
	        }
	    }
		assertTrue(isANumber);
	}

	@Test
	public void is_string_a_number_java_with_regular_expression () {

		boolean isANumber = false;
		String numberString = "1234.54";
		
		if (numberString.matches("[+-]?\\d*(\\.\\d+)?")) {
			isANumber = true;
		}
		assertTrue(isANumber);
	}

	@Test
	public void is_string_a_number_guava () {
		
		Double parsedString = Doubles.tryParse("123234.54");
		
		assertEquals(new Double(123234.54), parsedString);
	}
	

	@Test
	public void is_string_a_number_apache_commons_stringutils () {
		
		boolean isANumber = StringUtils.isNumeric("12345");
		assertTrue(isANumber);
	}

	
	@Test
	public void is_string_a_number_apache_commons () {
		
		boolean isANumber = NumberUtils.isNumber("12345");
		assertTrue(isANumber);
	}

	@Test
	public void is_formatted_string_a_number_apache_commons () {
		
		boolean isANumber = NumberUtils.isNumber("123123.45");
		assertTrue(isANumber);
	}

	
}