package p5.com.byd.mes.dev.tool.baseToChar;
/**
* 任意进制转换器
* @author solar
*/
public class Decimal {
String imalss = "";
String[] imal = new String[10];
int flag = 0;
public Decimal(String imals) {
String[] temp = imals.split("");
String[] imalTemp = new String[temp.length - 1];
for (int i = 0; i < imalTemp.length; i++) {
imalTemp[i] = temp[i + 1].toUpperCase();
}
imalss = imals.toUpperCase();
imal = imalTemp;
flag = imal.length;
}
public long toDec(String in) throws Exception {
long temp = 0;
in = in.toUpperCase();
String[] ins = in.split("");
for (int i = 1; i < ins.length; i++) {
long ff = imalss.indexOf(ins[i]);
if (ff == -1) {
throw new Exception("非法字符串");
}
temp = temp + solar(ins.length - i) * ff;
}
return temp;
}
public String parseDec(long in) throws Exception {
StringBuffer sbTemp = new StringBuffer();
long i = in % flag;
while (in != 0) {
sbTemp.append(imal[(int) i]);
in = in / flag;
i = in % flag;
}
sbTemp.reverse();
return new String(sbTemp);
}
private long solar(int length) {
long temp = 1;
while (length > 1) {
temp = temp * flag;
length--;
}
return temp;
}
/***************************************************************************
* 单元测试
* @param args the command line arguments
**************************************************************************/
public static void main(String[] args) throws Exception {
Decimal dec = new Decimal("23456789BCDFGHJKLMNPQRSTVWXZ");//构造一个指定的进制对象。
//System.out.println(dec.toDec("23420"));
System.out.println(dec.parseDec(892));
}
}
private static final Log log = LogFactory.getLog(Base28Impl.class);
private static Decimal dec = new Decimal("23456789BCDFGHJKLMNPQRSTVWXZ");//构造自定义28进制的对象
@Override
public String getDesc() {
return "二十八进制";
}
@Override
public String get(long cursor, NextNumberBO nextNumberBO) {
String data = null;
try {
data = dec.parseDec(cursor);
} catch (Exception e) {
log.debug(e.getMessage());
throw new RuntimeException("二十八进制转换失败!");
}
long sequenceLength = 0L;
try {
sequenceLength = dec.toDec(nextNumberBO.getSequenceLength());
} catch (Exception e) {
log.debug(e.getMessage());
}
//产生二十八进制的流水号。
return StringUtils.leftPad(data, (int)sequenceLength, "2");
}
@Override
public boolean isEngenderNextNumber(NextNumberBO nextNumberBO) {
long maxSequence = 0L;
long currentSequence = 0L;
try {
maxSequence = dec.toDec(nextNumberBO.getMaxSequence());
currentSequence = dec.toDec(nextNumberBO.getCurrentSequence());
} catch (Exception e) {
log.debug(e.getMessage());
}
long qty = maxSequence - nextNumberBO.getDistributeNum().longValue();
long newQty = currentSequence + nextNumberBO.getIncr().longValue();
//已分配数量少于最大序列 且 可分配数量要大于等于增量 且 最大序列要大于 (当前序列+增量)的和
boolean falg = nextNumberBO.getDistributeNum().longValue() < maxSequence
&& qty >= nextNumberBO.getIncr().longValue()
&& maxSequence > newQty;
return falg;
}
@Override
public boolean validate(NextNumberBO nextNumberBO) {
if(!validateSequence(nextNumberBO.getSequenceLength().toString()))
throw new RuntimeException("验证序列长度失败,请填写正确的数据进行操作!");
if(!validateSequence(nextNumberBO.getMaxSequence().toString()))
throw new RuntimeException("验证最大序列失败,请填写正确的数据进行操作!");
if(!validateSequence(nextNumberBO.getMinSequence().toString()))
throw new RuntimeException("验证最小序列失败,请填写正确的数据进行操作!");
if(!validateSequence(nextNumberBO.getCurrentSequence().toString()))
throw new RuntimeException("验证当前序列失败,请填写正确的数据进行操作!");
long maxSequence = 0L;
long minSequence = 0L;
long currentSequence = 0L;
try {
maxSequence = dec.toDec(nextNumberBO.getMaxSequence());
minSequence = dec.toDec(nextNumberBO.getMinSequence());
currentSequence = dec.toDec(nextNumberBO.getCurrentSequence());
} catch (Exception e) {
log.debug(e.getMessage());
}
if(maxSequence < minSequence)
throw new RuntimeException("最大序列必须大于最小序列!");
if(maxSequence < currentSequence)
throw new RuntimeException("最大序列必须大于当前序列!");
long distributeUnitNum = nextNumberBO.getDistributeUnitNum().longValue();
if(distributeUnitNum > maxSequence)
throw new RuntimeException("预加载分配单元数不能大于最大序列");
long distributeNum = nextNumberBO.getDistributeNum().longValue();
if(distributeNum > maxSequence)
throw new RuntimeException("已分配数不能大于最大序列");
return true;
}
/**
* 验证是否是正确的二十八进制数值
* @param sequence
* @return
*/
private boolean validateSequence(String sequence){
Pattern pattern = Pattern.compile("[0-9B-Z&&[^EYUIO]]+");//二十八进制的正则表达式
return pattern.matcher(sequence).matches();
}
/**
* 28进制的日期格式转换
* @param pattern
* @return
*/
@Override
public String toDate(String pattern){
SimpleDateFormat format = new SimpleDateFormat(pattern);
String result = format.format(new Date());
StringBuffer buffer = new StringBuffer();
Date date = null;
try {
date = (Date)format.parseObject(result);
} catch (ParseException e) {
e.printStackTrace();
}
if(pattern.indexOf("yyyy") > -1){
String year = Base28Utils.getYear(date.getYear()+1900);
buffer.append(year);
}
if(pattern.indexOf("MM") > -1){
String month = Base28Utils.getMonth(date.getMonth()+1);
buffer.append(month);
}
if(pattern.indexOf("dd") > -1){
String day = getResult(date.getDate());
buffer.append(day);
}
if(pattern.indexOf("HH") > -1){
String hours = getResult(date.getHours());
buffer.append(hours);
}
if(pattern.indexOf("mm") > -1){
String minutes = getResult(date.getMinutes());
buffer.append(minutes);
}
if(pattern.indexOf("ss") > -1){
String seconds = getResult(date.getSeconds());
buffer.append(seconds);
}
return buffer.toString();
}
/**
*
* getResult:(将数值转换成相对应的进制)
* @param @param data
* @return String
*/
private String getResult(long data){
try{
return dec.parseDec(data);
}catch(Exception ex){
}
return null;
}
分享到:
相关推荐
压缩包内的文件`进制转换update.c`可能包含了对原有代码的更新或改进,`进制转换toInt.c`可能是一个专门用于将其他进制转换成整数的函数,而`进制转换.c`则可能是整个进制转换功能的核心源文件。 在C语言中实现进制...
综上所述,"基于单片机(AT89C51)的进制转换及进制计算器"项目涵盖了单片机原理、进制转换算法、程序设计、硬件接口设计等多个方面的知识。通过这个项目,开发者不仅可以提升单片机编程技能,还能深入理解进制转换的...
辅助软件 进制转换V2.1辅助软件 进制转换V2.1辅助软件 进制转换V2.1辅助软件 进制转换V2.1辅助软件 进制转换V2.1辅助软件 进制转换V2.1辅助软件 进制转换V2.1辅助软件 进制转换V2.1辅助软件 进制转换V2.1辅助软件 ...
《易语言模块完全进制转换》 易语言作为一款国内自主研发的编程语言,以其独特的“易”学特性,深受广大编程初学者和爱好者喜爱。在编程过程中,进制转换是一项基础且重要的技能,无论是十进制、二进制、八进制还是...
"微机原理进制转换程序设计" 本资源摘要信息是关于微机原理中进制转换程序设计的知识点总结。进制转换是计算机科学中一个非常重要的概念,涉及到不同数制之间的转换,如二进制、十进制、十六进制等。 1. 需求说明 ...
文档中虽然存在OCR扫描识别错误,但是可以推测出内容涉及了进制转换相关的关键字,比如“Decimal number”代表十进制数,“Hex”代表十六进制数,这些关键字都是进行进制转换时常用的术语。 文档提供的其他链接和...
进制转换是计算机科学中的基础概念,用于在不同的数值系统之间转换数字,常见的有二进制、八进制、十进制和十六进制。在编程和计算机操作中,理解和运用这些进制转换至关重要。 标题"各种进制转换工具精简版"指的是...
进制转换是计算机科学中的基础概念,用于在不同的数值系统之间转换数字。在这个场景中,我们讨论的是一个基于MFC(Microsoft Foundation Classes)框架编写的进制转换器应用。MFC是微软提供的一套C++类库,它使得...
计算机各种进制转换练习题 计算机中的进制转换是计算机科学和信息技术中的一种基本概念。它是指在不同进制系统之间进行数值表示的转换,例如十进制、 二进制、八进制、十六进制等。下面是计算机各种进制转换的练习...
在编程领域,进制转换是一项基础且重要的技能。在C#这种高级编程语言中,进行进制转换可以方便地处理二进制、八进制、十进制和十六进制等不同数字系统之间的数据交互。本项目是一个专门针对进制转换的小程序,旨在...
至于八进制到十六进制,我们需要先将八进制转换为十进制,然后将十进制转换为十六进制。在转换为十进制之后,我们可以使用`HEX`函数(在某些系统中可能为`CONVERT(VARBINARY, ..., 16)`)将数字转换为十六进制。例如...
了解并能够灵活运用ASCII码与十六进制转换对于IT专业人员来说是至关重要的。 ASCII码是基于拉丁字母的一套电脑编码系统,最初设计用于打字机,现在已经成为电子通信的标准之一。它包含了128个字符,包括英文大小写...
在C#编程环境中,Winform应用常常用于创建用户界面,而进制转换是计算机科学的基础概念,涉及到二进制(Binary)、八进制(Octal)、十进制(Decimal)和十六进制(Hexadecimal)之间的数值转换。下面将详细阐述如何...
"进制转换练习题及答案39资料.pdf" 本文档提供了39道进制转换练习题及答案,涵盖二进制、十进制、十六进制之间的转换,ASCII 码、汉字国标码、商品条形码等标准化编码的知识点。通过这些练习题,可以帮助学生和从业...
《魔兽争霸WAR3 JASS技能ID进制转换器详解及应用》 在魔兽争霸III(WAR3)的游戏世界中,地图编辑器与JASS(Just Another Scripting System)语言为玩家提供了无限的创意空间,让游戏爱好者能够自定义游戏规则、...
进制转换是计算机科学中的基础概念,涉及到二进制(Binary)、八进制(Octal)、十进制(Decimal)和十六进制(Hexadecimal)等不同数字系统间的转换。这些进制转换在编程、数据存储、硬件设计等多个IT领域都有广泛...
在IT领域,进制转换是一项基础且至关重要的技能,它涉及到计算机科学的多个方面,如数据存储、计算、编码和通信。本工具专注于二进制、八进制、十进制和十六进制之间的转换,这些是计算机系统中最常见的数字表示形式...
"计算机各种进制转换练习题" 计算机进制转换是计算机科学中的一种基本概念,指的是将不同进制的数字进行相互转换,如十进制、 二进制、八进制、十六进制等。这种转换在计算机科学和编程中有着广泛的应用。 在本...
Java实现的进制转换工具类完整示例 Java实现的进制转换工具类是Java语言中的一种常用工具类,用于实现各种进制之间的转换操作,如二进制、十六进制、字符串、数组等。该工具类主要提供了将字节数组转换为十六进制...