如何很好地格式化浮动数字字符串没有不必要的十进制0?

  • 回答 (2)
  • 关注 (0)
  • 查看 (80)

一个64位的double可以精确地表示整数+/- 2 53

鉴于这个事实,我选择使用双类型作为我所有类型的单一类型,因为我最大的整数是无符号的32位。

但现在我必须打印这些伪整数,但问题是他们也混入了实际的双打。

那么如何在Java中很好地打印这些双打呢?

我已经尝试过String.format("%f", value),这是接近的,除了我得到很多小值的尾随零。

这是一个输出的例子 %f

232.00000000
0.18000000000
1237875192.0
4.5800000000
0.00000000
1.23450000

我想要的是:

232
0.18
1237875192
4.58
0
1.2345

当然,我可以写一个函数来修剪这些零,但是由于字符串操作,性能会有很大的损失。我可以用另一个格式代码更好吗?

编辑

Tom E.和Jeremy S.的答案是无法接受的,因为它们都是任意取整到小数点后两位。请在回答之前了解问题。

编辑2

请注意,String.format(format, args...)是区域设置相关的(见下面的答案)。

nr348399nr348399提问于
HKC

红客学院 · 创始人 (已认证)

道可道 非常道 名可名 非常名回答于
#include <stdio.h>  
int main()  
{  
    char   szValue[]  =   "0x11";     
    int    nValude    =   0;         
    sscanf(szValue,"%x",&nValude);     
    printf("%d/n",nValude);  
    return 0;     
}  
/*输出: 
  17 
*/  

主要用到sscanf这个库函数:

函数名: sscanf

功 能: 执行从字符串中的格式化输入

用 法: int sscanf(char *string, char *format[,argument,...]); //%x就是我们要格式化的类型,即输出十六进制

MyLove回答于

在程序中,我们有时需要将一个十六进制字符串转换为十进制数字。比如:

char *ptr="0x11";
int n=0;

//我们想让n等于0x11,即17

通常我们在C中,想将一个字符串转换为一整形数字,通常会使用下面的方法:

char *ptr="123";      
int n=0;  
n=atoi(ptr);  
printf("%d/n",n);  
//输出:123  

但是atoi库函数只能将十进制字符串转化为int整形,比如下面的例子:

#include <stdlib.h>   
#include <stdio.h>//atoi头文件   
int main(void)   
{   
   int n;   
   char *str = "12345.67";   
   n = atoi(str); //int atoi(const char *nptr);   
   printf("string = %s integer = %d/n", str, n);   
   return 0;   
}  
/*输出: 
  string = 12345.67 integer = 12345 
*/  

所以要用atoi函数将"0x11"转化为十进制整形17是不行的。如果用的话,会输出下面的结果:

int n;   
char *str = "0x11";   

n = atoi(str); //返回值n等于0 (显然不是我们想要的结果)

那怎么办呢?这时有人会想,那好办,我们自己写个函数转化下就行了,比如用下面的方法:

注意:我们用VC 6.0建了一个Win32控制台程序,为了方便,程序中使用了CString类型变量,需要做一点修改。

(1)包含afx.h头文件

(2)在Project->Settings->General->Mircosoft Foundation Classes中,选择Use MFC in a Shared DLL

然后我们就可以在Win32控制台下使用CString变量了,否则会出现编译错误。

#include <iostream>  
#include <afx.h>  
int ChangeNum(CString str,int length)     
{     
    char  revstr[16]={0};  //根据十六进制字符串的长度,这里注意数组不要越界  
    int   num[16]={0};     
    int   count=1;     
    int   result=0;     
    strcpy(revstr,str);     
    for   (int i=length-1;i>=0;i--)     
    {     
        if ((revstr[i]>='0') && (revstr[i]<='9'))     
            num[i]=revstr[i]-48;//字符0的ASCII值为48  
        else if ((revstr[i]>='a') && (revstr[i]<='f'))     
            num[i]=revstr[i]-'a'+10;     
        else if ((revstr[i]>='A') && (revstr[i]<='F'))     
            num[i]=revstr[i]-'A'+10;     
        else     
            num[i]=0;   
        result=result+num[i]*count;     
        count=count*16;//十六进制(如果是八进制就在这里乘以8)      
    }     
    return result;     
}  
int main()  
{  
    CString   str="0x11";   
    int n=0;  
    n=ChangeNum(str,str.GetLength());  
    printf("%d/n",n);  
        return 0;     
}  
/*输出: 
  17 
*/  

是的,上面方法可以得到我们想要的值。还有更简单的方法吗?当然有!

扫码关注云+社区

领取腾讯云代金券