package org.nutz.lang;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 关于数的一些帮助函数
*
* @author zozoh(zozohtnt@gmail.com)
*/
public abstract class Nums {
/**
* 计算尺寸
*
* @param v
* 要计算的尺寸值的类型可以是
* <ul>
* <li>500 - 整数,直接返回
* <li>.12 - 浮点,相当于一个百分比,可以大于 1.0
* <li>"12%" - 百分比,相当于 .12
* </ul>
* @param base
* 百分比的基数
*
* @return 根据基数计算后的数值
*/
public static double dimension(String v, double base) {
// 试试整型
try {
Integer nb = Integer.valueOf(v);
return nb.intValue();
}
catch (NumberFormatException e) {}
// 试试浮点
try {
Double nb = Double.valueOf(v);
return nb.doubleValue() * base;
}
catch (NumberFormatException e) {}
// 百分比
Pattern p = Pattern.compile("^([0-9.]{1,})%$");
Matcher m = p.matcher(v);
if (m.find()) {
Double nb = Double.valueOf(m.group(1));
return (nb.doubleValue() / 100) * base;
}
// 靠不知道是啥
throw Lang.makeThrow("fail to dimension : " + v);
}
/**
* @see #dimension(String, double)
*/
public static int dimension(String v, int base) {
return (int) (dimension(v, (double) base));
}
/**
* @param nbs
* 一组数字
* @return 数字之和
*/
public static int sum(int... nbs) {
int re = 0;
for (int nb : nbs)
re += nb;
return re;
}
/**
* 一个数的字面量的进制和值
*/
public static class Radix {
Radix(String val, int radix) {
this.val = val;
this.radix = radix;
}
public int radix;
public String val;
}
/**
* @param str
* 数字的字符串
* @return 字符串的进制
*
* @see org.nutz.lang.Nums.Radix
*/
public static Radix evalRadix(String str) {
if (str.startsWith("0x"))
return new Radix(str.substring(2), 16);
if (str.startsWith("0") && str.length() > 1)
return new Radix(str.substring(1), 8);
if (str.startsWith("0b"))
return new Radix(str.substring(2), 2);
return new Radix(str, 10);
}
/**
* 将一个字符串变成一个整型数组,如果字符串不符合规则,对应的元素为 -1 <br>
* 比如:
*
* <pre>
* "3,4,9" => [ 3, 4, 9 ]
* "a,9,100" => [ -1, 9, 100 ]
* </pre>
*
* @param str
* 半角逗号分隔的数字字符串
* @return 数组
*/
public static int[] splitInt(String str) {
String[] ss = Strings.splitIgnoreBlank(str);
if (null == ss)
return null;
int[] ns = new int[ss.length];
for (int i = 0; i < ns.length; i++) {
try {
ns[i] = Integer.parseInt(ss[i]);
}
catch (NumberFormatException e) {
ns[i] = -1;
}
}
return ns;
}
/**
* @see #splitInt(String)
*/
public static long[] splitLong(String str) {
String[] ss = Strings.splitIgnoreBlank(str);
if (null == ss)
return null;
long[] ns = new long[ss.length];
for (int i = 0; i < ns.length; i++) {
try {
ns[i] = Long.parseLong(ss[i]);
}
catch (NumberFormatException e) {
ns[i] = -1;
}
}
return ns;
}
/**
* 将一个字符串变成一个浮点数数组,如果字符串不符合规则,对应的元素为 0.0 <br>
* 比如:
*
* <pre>
* "3,4,9" => [ 3.0f, 4.0f, 9.0f ]
* "a,9.8,100" => [ 0.0f, 9.0f, 100.0f ]
* </pre>
*
* @param str
* 半角逗号分隔的数字字符串
* @return 数组
*/
public static float[] splitFloat(String str) {
String[] ss = Strings.splitIgnoreBlank(str);
if (null == ss)
return null;
float[] ns = new float[ss.length];
for (int i = 0; i < ns.length; i++) {
try {
ns[i] = Float.parseFloat(ss[i]);
}
catch (NumberFormatException e) {
ns[i] = 0.0f;
}
}
return ns;
}
/**
* 将一个字符串变成一个双精度数数组,如果字符串不符合规则,对应的元素为 -1
*
* @param str
* 半角逗号分隔的数字字符串
* @return 数组
*/
public static double[] splitDouble(String str) {
String[] ss = Strings.splitIgnoreBlank(str);
if (null == ss)
return null;
double[] ns = new double[ss.length];
for (int i = 0; i < ns.length; i++) {
try {
ns[i] = Long.parseLong(ss[i]);
}
catch (NumberFormatException e) {
ns[i] = -1;
}
}
return ns;
}
/**
* @see #splitInt(String)
*/
public static boolean[] splitBoolean(String str) {
String[] ss = Strings.splitIgnoreBlank(str);
if (null == ss)
return null;
boolean[] ns = new boolean[ss.length];
for (int i = 0; i < ns.length; i++) {
try {
ns[i] = Pattern.matches("^(1|yes|true|on)$", ss[i].toLowerCase());
}
catch (NumberFormatException e) {
ns[i] = false;
}
}
return ns;
}
/**
* @see #indexOf(int[], int, int)
*/
public static int indexOf(int[] arr, int v) {
return indexOf(arr, v, 0);
}
/**
* @param arr
* 数组
* @param v
* 值
* @param off
* 从那个下标开始搜索(包含)
* @return 第一个匹配元素的下标
*/
public static int indexOf(int[] arr, int v, int off) {
if (null != arr)
for (int i = off; i < arr.length; i++) {
if (arr[i] == v)
return i;
}
return -1;
}
/**
* @param arr
* @param v
* @return 最后一个匹配元素的下标
*/
public static int lastIndexOf(int[] arr, int v) {
if (null != arr)
for (int i = arr.length - 1; i >= 0; i--) {
if (arr[i] == v)
return i;
}
return -1;
}
/**
* @see #indexOf(char[], char, int)
*/
public static int indexOf(char[] arr, char v) {
if (null != arr)
for (int i = 0; i < arr.length; i++) {
if (arr[i] == v)
return i;
}
return -1;
}
/**
* @param arr
* 数组
* @param v
* 值
* @param off
* 从那个下标开始搜索(包含)
* @return 第一个匹配元素的下标
*/
public static int indexOf(char[] arr, char v, int off) {
if (null != arr)
for (int i = off; i < arr.length; i++) {
if (arr[i] == v)
return i;
}
return -1;
}
/**
* @param arr
* @param v
* @return 第一个匹配元素的下标
*/
public static int lastIndexOf(char[] arr, char v) {
if (null != arr)
for (int i = arr.length - 1; i >= 0; i--) {
if (arr[i] == v)
return i;
}
return -1;
}
/**
* @see #indexOf(long[], long, int)
*/
public static int indexOf(long[] arr, long v) {
return indexOf(arr, v, 0);
}
/**
* @param arr
* 数组
* @param v
* 值
* @param off
* 从那个下标开始搜索(包含)
* @return 第一个匹配元素的下标
*/
public static int indexOf(long[] arr, long v, int off) {
if (null != arr)
for (int i = off; i < arr.length; i++) {
if (arr[i] == v)
return i;
}
return -1;
}
/**
* @param arr
* @param v
* @return 第一个匹配元素的下标
*/
public static int lastIndexOf(long[] arr, long v) {
if (null != arr)
for (int i = arr.length - 1; i >= 0; i--) {
if (arr[i] == v)
return i;
}
return -1;
}
/**
* 不解释,你懂的
*/
public static int[] array(int... is) {
return is;
}
/**
* 判断一个整数是否在数组中
*
* @param arr
* 数组
* @param i
* 整数
* @return 是否存在
*/
public static boolean isin(int[] arr, int i) {
return indexOf(arr, i) >= 0;
}
/**
* 整合两个整数数组为一个数组 <b>这个方法在JDK5不可用!!<b/>
*
* @param arr
* 整数数组
* @param is
* 变参
* @return 新的整合过的数组
*/
public static int[] join(int[] arr, int... is) {
if (null == arr)
return is;
int length = arr.length + is.length;
int[] re = new int[length];
System.arraycopy(arr, 0, re, 0, arr.length);
int i = arr.length;
for (int num : is)
re[i++] = num;
return re;
}
/**
* 不解释,你懂的
*/
public static long[] arrayL(long... is) {
return is;
}
/**
* 判断一个长整数是否在数组中
*
* @param arr
* 数组
* @param i
* 长整数
* @return 是否存在
*/
public static boolean isin(long[] arr, long i) {
return indexOf(arr, i) >= 0;
}
/**
* 整合两个长整数数组为一个数组 <b>这个方法在JDK5不可用!!<b/>
*
* @param arr
* 长整数数组
* @param is
* 变参
* @return 新的整合过的数组
*/
public static long[] join(long[] arr, long... is) {
if (null == arr)
return is;
int length = arr.length + is.length;
long[] re = new long[length];
System.arraycopy(arr, 0, re, 0, arr.length);
int i = arr.length;
for (long num : is)
re[i++] = num;
return re;
}
/**
* 不解释,你懂的
*/
public static char[] arrayC(char... is) {
return is;
}
/**
* 判断一个长整数是否在数组中
*
* @param arr
* 数组
* @param i
* 长整数
* @return 是否存在
*/
public static boolean isin(char[] arr, char i) {
return indexOf(arr, i) >= 0;
}
/**
* 整合两个长整数数组为一个数组 <b>这个方法在JDK5不可用!!<b/>
*
* @param arr
* 长整数数组
* @param is
* 变参
* @return 新的整合过的数组
*/
public static char[] join(char[] arr, char... is) {
if (null == arr)
return is;
int length = arr.length + is.length;
char[] re = new char[length];
System.arraycopy(arr, 0, re, 0, arr.length);
int i = arr.length;
for (char num : is)
re[i++] = num;
return re;
}
}