/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.core.util; import java.text.NumberFormat; import java.text.ParseException; /** * Utilities for dealing with number parsing / formatting. This class is mainly meant to be used by java beans and other * classes that must do number formatting but cannot throw any exceptions during the process. */ public final class NumberUtil { /** * Constant value representing "not a number". */ public static final Number NaN = Double.NaN; // static class, privatize ctor private NumberUtil() { } /** * Parse the <code>input</code> string (using the default locale) and return its numeric representation. If the * <code>input</code> string is null, empty or cannot be parsed, return <code>{@link Double#NaN} <code>. */ public static Number stringAsNumber(String input) { return _parse(input, NumberFormat.getNumberInstance()); } /** * Format the <code>input</code> number as a string (using the default locale). If the <code>input</code> number is * <code>{@link Double#NaN}</code>, return null. */ public static String numberAsString(double input) { return _format(input, NumberFormat.getNumberInstance()); } /** * Parse the <code>input</code> string (using the default locale) and return its numeric percentage representation. * If the <code>input</code> string is null, empty or cannot be parsed, return <code>{@link Double#NaN} <code>. */ public static Number stringAsPercentage(String input) { return _parse(input, NumberFormat.getPercentInstance()); } /** * Format the <code>input</code> percentage as a string (using the default locale). If the <code>input</code> * percentage is <code>{@link Double#NaN}</code>, return null. */ public static String percentageAsString(double input) { return _format(input, NumberFormat.getPercentInstance()); } /** * Given an old version string, this attempts to auto-generate a new incremented version. * * @param oldVersion the version to increment * @return the auto-incremented version */ public static String autoIncrementVersion(String oldVersion) { String newVersion = "1.0"; if (oldVersion != null && oldVersion.length() != 0) { String[] parts = oldVersion.split("[^a-zA-Z0-9]"); String lastPart = parts[parts.length - 1]; try { int lastNumber = Integer.parseInt(lastPart); newVersion = oldVersion.substring(0, oldVersion.length() - lastPart.length()) + (lastNumber + 1); } catch (NumberFormatException nfe) { newVersion = oldVersion + ".1"; } } return newVersion; } //------------------------------------------------------------------ //-- private helpers //------------------------------------------------------------------ private static Number _parse(String input, NumberFormat fmt) { if ((null != input) && (input.trim().length() > 0)) { try { return fmt.parse(input); } catch (ParseException e) { return NaN; } } else { return NaN; } } private static String _format(double input, NumberFormat fmt) { if (NaN.doubleValue() != input) { return fmt.format(input); } else { return null; } } } // EOF