求小数的科学计数法法和小数之间的相互转化

下次自动登录
现在的位置:
& 综合 & 正文
java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的形式
当使用POI处理excel的时候,遇到了比较长的数字,虽然excel里面设置该单元格是文本类型的,但是POI的cell的类型就会变成数字类型。 而且无论数字是否小数,使用cell.getNumbericCellValue() 去获取值的时候,会得到一个double,而且当长度大一点的时候会变成科学计数法形式。 那么获取这个单元格的原始的数据,就其实是一个double怎么转换成整数的问题了。 使用DecimalFormat对这个double进行了格式话,随后使用format方法获得的String就是你想要的值了。
DecimalFormat df = new DecimalFormat("0");
String whatYourWant = df.format(cell.getNumericCellValue());
再读本篇文章之前,请先看我的前一篇,前一篇中有重点讲到POI设置EXCEL单元格格式为文本格式,剩下的设置小数、百分比、货币、日期、科学计数法和中文大写这些将在下面一一写出
以下将要介绍的每一种都会用到这三行中的变量
HSSFWorkbook demoWorkBook = new HSSFWorkbook();
HSSFSheet demoSheet = demoWorkBook.createSheet("The World's 500 Enterprises");
HSSFCell cell = demoSheet.createRow(0).createCell(0);
第一种:日期格式
cell.setCellValue(new Date());
//set date format
HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
HSSFDataFormat format= demoWorkBook.createDataFormat();
cellStyle.setDataFormat(format.getFormat("yyyy年m月d日"));
cell.setCellStyle(cellStyle);
第二种:保留两位小数格式
cell.setCellValue(1.2);
HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
cell.setCellStyle(cellStyle);
这里与上面有所不同,用的是HSSFDataFormat.getBuiltinFormat()方法,之所以用这个,是因为0.00是Excel内嵌的格式,完整的Excel内嵌格式列表大家可以看这个窗口中的自定义列表:
这里就不一一列出了
第三种:货币格式
cell.setCellValue(20000);
HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
HSSFDataFormat format= demoWorkBook.createDataFormat();
cellStyle.setDataFormat(format.getFormat("?#,##0"));
cell.setCellStyle(cellStyle);
第四种:百分比格式
cell.setCellValue(20);
HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00%"));
cell.setCellStyle(cellStyle);
此种情况跟第二种一样
第五种:中文大写格式
cell.setCellValue(20000);
HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
HSSFDataFormat format= demoWorkBook.createDataFormat();
cellStyle.setDataFormat(format.getFormat("[DbNum2][$-804]0"));
cell.setCellStyle(cellStyle);
第六种:科学计数法格式
cell.setCellValue(20000);
HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
cellStyle.setDataFormat( HSSFDataFormat.getBuiltinFormat("0.00E+00"));
cell.setCellStyle(cellStyle);
此种情况也与第二种情况一样
实际开发过程中通常用到的就是从数据库导出EXCEL表格了,JXL可以这样做,其实POI也可以(关于JXL与POI的异同可访问我之前总结的),之前写过POI对七种文档(当然也包括EXCEL)的内容读取操作的,这次要写的就非常重要了,就是开发中经常会用到的POI读取数据库导出EXCEL的操作,所谓导出EXCEL也就是生成带数据内容的新的EXCEL文件
目前的POI版本是3.7
下载地址:http://poi.apache.org/download.html#POI-3.7
必须包只有一个:poi-3.7-.jar
整理思路:1)数据库中的字段对应EXCEL的最顶层一行各个CELL名称[也就是上面图片中序号版本...的]
2)将每个数据一次插入到对应名称CELL的对应记录位置
3)为了方便操作,顶层的cell各个名称可以抽取出来成为一个单独类
第一部分:单独的EXCEL表头类
public class Cachetable {
private int
private String devIp;
public Cachetable() {
public Cachetable(int recnum, String devIp, String srcaddr, String dstaddr, String nexthop, String input, String output, String dpkts, String doctets, String sstart, String dstport, String prot, String tos, String srcas, String dstas,String pduversion) {
this.recnum =
this.devIp = devIp;
this.srcaddr =
this.dstaddr =
this.nexthop =
this.input =
this.output =
this.dpkts =
this.doctets =
this.sstart =
this.dstport =
this.prot =
this.tos =
this.srcas =
this.dstas =
this.pduversion =
public int getRecnum() {
return this.
public void setRecnum(int recnum) {
this.recnum=
public String getDevIp() {
return this.devIp;
public void setDevIp(String devIp) {
this.devIp = devIp;
public String getSrcaddr() {
return this.
public void setSrcaddr(String srcaddr) {
this.srcaddr =
public String getDstaddr() {
return this.
public void setDstaddr(String dstaddr) {
this.dstaddr =
public String getNexthop() {
return this.
public void setNexthop(String nexthop) {
this.nexthop =
public String getInput() {
return this.
public void setInput(String input) {
this.input =
public String getOutput() {
return this.
public void setOutput(String output) {
this.output =
public String getDpkts() {
return this.
public void setDpkts(String dpkts) {
this.dpkts =
public String getDoctets() {
return this.
public void setDoctets(String doctets) {
this.doctets =
public String getSstart() {
return this.
public void setSstart(String sstart) {
this.sstart =
public String getDstport() {
return this.
public void setDstport(String dstport) {
this.dstport =
public String getProt() {
return this.
public void setProt(String prot) {
this.prot =
public String getTos() {
return this.
public void setTos(String tos) {
this.tos =
public String getSrcas() {
return this.
public void setSrcas(String srcas) {
this.srcas =
public String getDstas() {
return this.
public void setDstas(String dstas) {
this.dstas =
public String getPduversion() {
return this.
public void setPduversion(String pduversion) {
this.pduversion =
第二部分:具体的POI操作生成EXCEL类
【我这里只是个示例,没连数据库,直接运行即可,如果想连,稍微变动一点即可】
package com.zkyy.flow.
import java.io.FileOutputS
import java.io.IOE
import java.io.OutputS
import java.sql.SQLE
import java.util.ArrayL
import java.util.L
import javax.swing.JOptionP
import org.apache.poi.hssf.usermodel.HSSFC
import org.apache.poi.hssf.usermodel.HSSFCellS
import org.apache.poi.hssf.usermodel.HSSFDataF
import org.apache.poi.hssf.usermodel.HSSFF
import org.apache.poi.hssf.usermodel.HSSFH
import org.apache.poi.hssf.usermodel.HSSFR
import org.apache.poi.hssf.usermodel.HSSFS
import org.apache.poi.hssf.usermodel.HSSFW
import com.kk.flow.webapp.util.C
public class ExcelOut {
public static final String[] tableHeader = {"序号","版本","接收时刻","设备","入接口","出接口",
"源IP","目的IP","下一跳","协议","端口","对端端口","TOS","源AS","目的AS","TCP_FLAG","pad1","pad2"};
public static HSSFWorkbook demoWorkBook = new HSSFWorkbook();
public static HSSFSheet demoSheet = demoWorkBook.createSheet("The World's 500 Enterprises");
public static final short cellNumber = (short)tableHeader.
public static final int columNumber = 1;
public static void createTableHeader()
HSSFHeader header = demoSheet.getHeader();
header.setCenter("世界五百强企业名次表");
HSSFRow headerRow = demoSheet.createRow((short) 0);
for(int i = 0;i & cellNi++)
HSSFCell headerCell = headerRow.createCell((short) i);
headerCell.setCellType(HSSFCell.CELL_TYPE_STRING);
headerCell.setCellValue(tableHeader[i]);
public static void createTableRow(List&String& cells,short rowIndex)
HSSFRow row = demoSheet.createRow((short) rowIndex);
for(int i = 0;i & cells.size();i++)
HSSFCell cell = row.createCell(i);
if(cell.getCellType()!=1){
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
HSSFCellStyle cellStyle2 = demoWorkBook.createCellStyle();
HSSFDataFormat format = demoWorkBook.createDataFormat();
cellStyle2.setDataFormat(format.getFormat("@"));
cell.setCellStyle(cellStyle2);
cell.setCellValue(cells.get(i));
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
public List&Cachetable& getDate() {
List&Cachetable& cacheList = new ArrayList&Cachetable&();
for (int j = 0; j & 300; j++) {
Cachetable tb = new Cachetable();
tb.setRecnum(j + 1);
tb.setDevIp("JavaCrazyer");
tb.setSrcaddr("北京");
tb.setDstaddr("xxx");
tb.setNexthop("yy");
tb.setInput("123");
tb.setOutput("127.0.0.1");
tb.setDpkts("what are you doing?");
tb.setDoctets("who are you?");
tb.setSstart("Oh
tb.setProt("One");
tb.setTos("two");
tb.setSrcas("three");
tb.setDstas("four");
tb.setPduversion("不知道");
cacheList.add(tb);
return cacheL
void createExcelSheet() throws SQLException{
createTableHeader();
int rowIndex=1;
List&Cachetable& list=getDate();
for(int j=0;j&list.size();j++){
List&String& listRead=new ArrayList&String&();
for(int i=1;i&=columNi++){
listRead.add(list.get(i).getDevIp());
listRead.add(list.get(i).getSrcaddr());
listRead.add(list.get(i).getDstaddr());
listRead.add(list.get(i).getNexthop());
listRead.add(list.get(i).getInput());
listRead.add(list.get(i).getOutput());
listRead.add(list.get(i).getDpkts());
listRead.add(list.get(i).getDoctets());
listRead.add(list.get(i).getSstart());
listRead.add(list.get(i).getProt());
listRead.add(list.get(i).getTos());
listRead.add(list.get(i).getSrcas());
listRead.add(list.get(i).getDstas());
listRead.add(list.get(i).getPduversion());
listRead.add(rowIndex+"");
createTableRow(listRead,(short)rowIndex);
rowIndex++;
public void exportExcel(HSSFSheet sheet,OutputStream os) throws IOException
sheet.setGridsPrinted(true);
HSSFFooter footer = sheet.getFooter();
footer.setRight("Page " + HSSFFooter.page() + " of " +
HSSFFooter.numPages());
demoWorkBook.write(os);
public static void main(String[] args) {
String fileName = "f:\\世界五百强企业名次表.xls";
FileOutputStream fos = null;
ExcelOut pd = new ExcelOut();
pd.createExcelSheet();
fos = new FileOutputStream(fileName);
pd.exportExcel(demoSheet,fos);
JOptionPane.showMessageDialog(null, "表格已成功导出到 : "+fileName);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "表格导出出错,错误信息 :"+e+"\n错误原因可能是表格已经打开。");
e.printStackTrace();
} finally {
fos.close();
} catch (Exception e) {
e.printStackTrace();
1)有关数据库连接,如果操作到数据库的话,在遍历数据库时用getDate这个方法遍历就可以啦,那么插入的数据就不是定值了,而是数据库中的值哦,具体操作数据库的步骤,我不用说,你懂得
2)有关涉及更改EXCEL的CELL格式为字符串,如图一般情况下大家导出的EXCEL表格CELL格式通常是常规的
这个问题,估计已经不止一两个朋友在网上问过,我至今没有看到一个满意的答案,通常大家都是想到既然是设置CELL格式肯定是通过cell.setCellType(HSSFCell.CELL_TYPE_STRING)然后插入数据再导出,诚然这种想法是对的,实际上不能起到任何作用,因为这个方法就是EXCEL默认的格式,写不写都一样(好多同学都不知道吧),再写出我的解决方案之前请大家参考下一段文字
第一段:Excel的单元格格式 图中的数据有数值、货币、时间、日期、文本等格式。这些数据格式在POI中的HSSFDataFormat类里都有相应的定义。
HSSFDataFormat是HSSF子项目里面定义的一个类。类HSSFDataFormat允许用户新建数据格式类型。HSSFDataFormat类包含静态方法static java.lang.String getBuiltinFormat(short index),它可以根据编号返回内置数据类型。另外static short getBuiltinFormat(java.lang.String format)方法则可以根据数据类型返回其编号,static java.util.List getBuiltinFormats()可以返回整个内置的数据格式列表。
在HSSFDataFormat里一共定义了49种内置的数据格式,如下面所示。
HSSFDataFormat的数据格式
内置数据类型
"#,##0.00"
"($#,##0_);($#,##0)"
"($#,##0_);[Red]($#,##0)"
"($#,##0.00);($#,##0.00)"
"($#,##0.00_);[Red]($#,##0.00)"
"0.00E+00"
"d-mmm-yy"
"h:mm AM/PM"
"h:mm:ss AM/PM"
"m/d/yy h:mm"
保留为过国际化用
0x17 - 0x24
"(#,##0_);(#,##0)"
"(#,##0_);[Red](#,##0)"
"(#,##0.00_);(#,##0.00)"
"(#,##0.00_);[Red](#,##0.00)"
"_($*#,##0_);_($*(#,##0);_($* \"-\"_);_(@_)"
"_(*#,##0.00_);_(*(#,##0.00);_(*\"-\"??_);_(@_)"
"_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"
"_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"
"[h]:mm:ss"
"##0.0E+0"
"@" - This is text format
在上面表中,字符串类型所对应的是数据格式为"@"(最后一行),也就是HSSFDataFormat中定义的值为0x31(49)的那行。Date类型的值的范围是0xe-0x11,本例子中的Date格式为""m/d/yy"",在HSSFDataFormat定义的值为0xe(14)。
第二段:POI中Excel文件Cell的类型 在读取每一个Cell的值的时候,通过getCellType方法获得当前Cell的类型,在Excel中Cell有6种类型,如下面所示。
Cell的类型
CELL_TYPE_BLANK
CELL_TYPE_BOOLEAN
CELL_TYPE_ERROR
CELL_TYPE_FORMULA
CELL_TYPE_STRING
CELL_TYPE_NUMERIC
一般都采用CELL_TYPE_STRING和CELL_TYPE_NUMERIC类型,因为在Excel文件中只有字符串和数字。如果Cell的Type为CELL_TYPE_NUMERIC时,还需要进一步判断该Cell的数据格式,因为它有可能是Date类型,在Excel中的Date类型也是以Double类型的数字存储的。Excel中的Date表示当前时间与日相隔的天数,所以需要调用HSSFDateUtil的isCellDateFormatted方法,判断该Cell的数据格式是否是Excel Date类型。如果是,则调用getDateCellValue方法,返回一个Java类型的Date。
好了读完上面两段文字我想大家关于CELL类型和格式应该清楚了,更应该清楚的是到底怎么才能将‘设置单元格格式’改成文本然后再导出
解决方案:就是上面代码中的ExcelOut类里面createTableRow方法中的一段代码
HSSFCellStyle cellStyle2 = demoWorkBook.createCellStyle();
HSSFDataFormat format = demoWorkBook.createDataFormat();
cellStyle2.setDataFormat(format.getFormat("@"));
cell.setCellStyle(cellStyle2);
看最终导出效果图吧,点击任何一个CELL右键设置单元格格式
JOptionPane.showMessageDialog(null, "表格已成功导出到 : "+fileName);这句话有点意思
看到没这就是javax.swing.JOptionPane类的有关消息输出的好处,很方便使用
PS:更多的关于POI设置EXCEL单元格格式为数字、百分比、货币、日期等等格式的,请看我接下来要写的
【上篇】【下篇】欢迎加入我们,一同切磋技术 &
用户名: &&&
密 码: &
共有 5910 人关注过本帖
标题:求1+2!+3!+4!+…+30!。 科学计数法,保留两位小数。
0-0我的程序哪里不对 ...
等 级:新手上路
&&已结贴√
&&问题点数:20&&回复次数:19&&&
求1+2!+3!+4!+…+30!。 科学计数法,保留两位小数。
0-0我的程序哪里不对了?
#include&stdio.h&
int main()
&&& int a,i,j,
&&& a=1;j=2;sum=0;
&&& for (i=0;i&=30;i++)
&&&&&&&&while(j&=i)
&&&&&&&&&&&&a=a*j;
&&&&&&&&&&&&j=j+1;
&&&&&&&&sum=sum+a;
&&& printf(&%.3g\n&,sum);
等 级:蜘蛛侠
帖 子:209
专家分:1054
int sum越界了程序代码:#include&stdio.h&
int main()
&&& int a,i,j;
&&& a=<font color=#;j=<font color=#;sum=<font color=#;
&&& for (i=<font color=#;i&=<font color=#;i++)
&&&&&&&&while(j&=i)
&&&&&&&&&&&&a=a*j;
&&&&&&&&&&&&j=j+<font color=#;
&&&&&&&&sum=sum+a;
&&& printf(&%.3g\n&,sum);
埋头做牛,抬头做人,低头做狗
等 级:新手上路
为什么int sum越界了?
等 级:新手上路
我去ACM&&A题了,还是错的..
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
这道题应该用到大数,你用long long 先试试
[fly]存在即是合理[/fly]
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
额,没看清题,要求两位小数你用.3g
[fly]存在即是合理[/fly]
来 自:残狼部落
等 级:业余侠客
帖 子:68
专家分:206
回复 3楼 lvluyun666
你可以去查查int型的取值范围!
然后估计一下你的sum值在这个范围内吗?
来 自:残狼部落
等 级:业余侠客
帖 子:68
专家分:206
#include&stdio.h&
int main()
&&long int a=1,i,j=2;
&&& float sum=0;
&&& for (i=0;i&=30;i++)
&&&&&&&&while(j&=i)
&&&&&&&&&&&&a=a*j;
&&&&&&&&&&&&j=j+1;
&&&&&&&&sum=sum+a;
&&& printf(&%.3f\n&,sum);
等 级:新手上路
回复 7楼 zjcl817
刚刚才反应过来..int的确越界了【挠头】
等 级:新手上路
回复 8楼 zjcl817
float不会越界嘛?
而且要科学计数法,float 可以表示科学计数法么?
float 的精度不是只有6-7位么?
版权所有,并保留所有权利。
Powered by , Processed in 0.100499 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved查看: 69330|回复: 6|关注: 0
[求扫盲]怎样不用科学计数法显示数字?
<h1 style="color:# 麦片财富积分
新手, 积分 5, 距离下一级还需 45 积分
比如说,一个数字32774.48
现在在Workspace里面显示出来都是 3.2774e+04 ,我想要的只是 32774.48。
请问该如何设置?
纯新手,先谢谢各位了。:)
论坛优秀回答者
帖子最佳答案
关注者: 711
《Simulink仿真及代码生成技术入门到精通》已经由北航出版社出版:http://item.jd.com/.html
<h1 style="color:#0 麦片财富积分
关注者: 3
format bank
<h1 style="color:# 麦片财富积分
谢谢二位!
那么再请问,能否设置成 不用科学计数法 + 显示小数点后4位& &呢? 或者能否像excel那样,小数点后有几位就显示几位?
[ 本帖最后由 900kg 于
09:00 编辑 ]
<h1 style="color:#0 麦片财富积分
关注者: 3
我不知道,好像format就是那么几种固定的格式,因为只是显示的需求,你实际输出的时候是可以完全控制需要几位的。
参考函数: format , fprintf
<h1 style="color:# 麦片财富积分
FORMAT SHORT G& &Best of fixed or floating point format with 5
& && && && && && && &&&digits.
FORMAT LONG G& & Best of fixed or floating point format with 15
& && && && && && && &&&digits for double and 7 digits for single.
<h1 style="color:# 麦片财富积分
format longG
站长推荐 /3
车辆动力学工具箱介绍:一款集成3D虚拟环境的汽车仿真产品
MATLAB中文论坛是全球最大的 MATLAB & Simulink 中文社区。用户免费注册会员后,即可下载代码,讨论问题,请教资深用户及结识书籍作者。立即注册加入我们吧!
MATLAB官方社交平台
MATLAB中文论坛微社区博客分类:
当使用POI处理excel的时候,遇到了比较长的数字,虽然excel里面设置该单元格是文本类型的,但是POI的cell的类型就会变成数字类型。
而且无论数字是否小数,使用cell.getNumbericCellValue() 去获取值的时候,会得到一个double,而且当长度大一点的时候会变成科学计数法形式。
那么获取这个单元格的原始的数据,就其实是一个double怎么转换成整数的问题了。
使用DecimalFormat对这个double进行了格式话,随后使用format方法获得的String就是你想要的值了。
DecimalFormat df = new DecimalFormat("0");
String whatYourWant = df.format(cell.getNumericCellValue());
浏览 32781
liuqing9382
浏览: 156235 次
来自: 北京
http://www.atool.org/crontab.ph ...
遇到了类似的问题,现在解决了,非常感谢!
解决了 太感谢了
厉害 很正确!!收益了。。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 php 科学计数法 小数 的文章

 

随机推荐