c正确的方法将字符串转换为可能具有前导零的十进制数

时间:2016-12-15 15:37:26

标签: c

我使用strtok1,2,1.0从字符串中提取了带小数位的数字。

更新 这种情况下的格式将限制在0.0 up to 1.0。所以单个主要&小数位。 printf用于用户反馈和确认后,该号码会传递到请求number format n.n的库。 Perhapse我误解了这条消息,如果这个数字少于一个,那么作为一个c程序只需要.n

我现在需要将第三个数字转换为具有n.n格式的int,如果小于1,则需要前导零。

我尝试过int, float, doubleatoi(x), strtoumax的几种组合,但在printf中获得11.0000....

我需要printf并在内部使用var。 那么最好的组合和格式是什么?

 // third number (this may move position in token order)
 ????? myNumber;

 strcpy(string, strtok( NULL, ","));
 myNumber=atoi(string);
 printf("the number is %?\n", myNumber);
 g_object_set(theItem, "alpha", myNumber, NULL); // accepts n.n only 0.0 -> 1.0

2 个答案:

答案 0 :(得分:3)

虽然你的问题不清楚,但我认为你想要的是:

double myNumber;  
myNumber = atof(string);    // "0.5" for example
printf("%03.1f", myNumber);  // Output: 0.5

格式化程序表示:

  • 0 - 带有前导零的垫
  • 3 - 总输出应至少为3个字符(整数,十进制,十分之一)如果需要,输出可能更多
  • .1 - 小数点后,显示1位数。

如果您真的想要int,但要显示小数位,我建议:

int myNumber = 3;
printf("%03.1f", (double)myNumber); // Resulting in output: "3.0"

避免整个strtok / atoi / printf问题,只需尝试这些硬编码调用即可。其中一个应该工作:

g_object_set(theItem, "alpha", "0.5", NULL); // Param is a string
g_object_set(theItem, "alpha",  0.5,  NULL); // Param is a double
g_object_set(theItem, "alpha",   .5,  NULL); // Param is also a double
g_object_set(theItem, "alpha",    1,  NULL); // Param is an int.

告诉我们哪一个有用。

答案 1 :(得分:0)

  

我使用strtok1,2,1.0从字符串中提取了带小数位的数字。

     

我现在需要将第三个数字转换为具有n.n格式的int,如果小于1,则需要前导零。

您将演示文稿混淆。所有C整数类型表示整数值 - 即,没有任何非零有效数字的值具有小于1的位值。因此,它们不为位值小于1的数字提供存储。此外,唯一的非负整数小于1是0,在某种意义上,它自动具有前导零。因此,您描述的转换不可用或不必要。

另一方面,如果你想格式化一个带有尾随(全零)小数位的整数,那么这很容易,但结果不再是{{1但是一个字符串(如果结果甚至保留)。例如:

int

也许您希望保留有关指定整数值的精度的信息 - 即小数点后的零数。在任何内置整数或浮点数据类型中,此类信息无法自然表示。如果需要,则必须单独跟踪该数据。

这同样适用于浮点 - 也就是说,你也不能将值与表示混淆。 C浮点数据类型(char decimal_integer[15]; int one_point_oh = 1; // does the right thing for 0, too: sprintf(decimal_integer, "%d.0", one_point_oh); floatdouble)表示数值,但它们不代表其格式。如果需要将格式详细信息与单个值相关联,则需要单独跟踪这些值。格式化演示编号时,您会考虑此类详细信息。