我已经定义了这样的字符数组。
char pkgamount[20]="";
这可以通过120,-120,-120.23等值(最多2位小数)填充
我目前将char数组转换为这样的整数。
int amt2;
sscanf(pkgamount, "%d", &amt2);
将包含负小数的字符数组转换为只包含2位小数的浮点值的正确方法是什么?
更新:#1
我从数据库(VARCHAR)读取值到字符数组。这个值最多有2个小数位。值可以是0 /有2个小数位/没有小数位。我认为整数数据类型不能有小数位。我需要添加/减去这些值。所以我需要将字符数组转换为float。
更新#2
我尝试使用float并且我不断得到一些随机输出。请在下面提取的代码
float bamt1,bamt2,amt1,amt2;
float balance1,balance2;
sscanf(stbamount, "%f", &amt1);
sscanf(pkgamount, "%f", &amt2);
//amoun1=32 amount2=23 any decimal or non decimal values..using API
//Using API on device to read this..skipping the code for that
sscanf(amount1, "%f", &bamt1);
sscanf(amount2, "%f", &bamt2);
balance1=amt1-bamt1;
balance2=amt2-bamt2;
// buffers used for conversion and printing
char buf1[sizeof(int)*3+2]="";
snprintf(buf1, sizeof buf1, "%f", balance1);
char buf2[sizeof(int)*3+2]="";
char sbal[20]="";
char pbal[20]="";
strcat(sbal,"STB Balance: ");
strcat(pbal,"PKG Balance: ");
strcat(sbal,buf1);
strcat(pbal,buf2);
//prn_write_text is API Call to run thermal printer on device
prn_write_text(sbal,strlen(sbal),1);
prn_write_text(pbal,strlen(pbal),1);
snprintf(buf2, sizeof buf2, "%f", balance2);
更新#3
这是使用热敏打印机编写一些文本的API调用。我需要将浮点值转换为字符串并将其剪切,以便它只包含2个十进制值。
答案 0 :(得分:1)
使用浮动来存储数字..
float amtf;
sscanf(pkgamount, "%f", &amtf);
将数字打印到2位小数
printf (".2%f",amtf);
只要您愿意在加法或减法期间容忍可能为0.01的错误,您就可以使用浮点数来存储数字。它使代码更容易。
但是,如果您必须精确到最后的0.00,那么您应该使用整数* 100来存储数据,如M Oehem所建议。
答案 1 :(得分:1)
只需循环播放你的角色
enum parseFloatErrorCodes {
SUCCESS, DOUBLE_DOT,PARSE_ERROR, INTEGER_OVERFLOW,
TOO_MANY_DIGITS_AFTER_DECIMAL_POINT
};
int parse_float(char* inp, float *x) {
char *p;
int ival, dot;
for (ival = 0, dot = 0, p = inp; *p; ++p) {
int overflow_check = ival;
if (('0' <= *p) && (*p <= '9')) {
ival = ival * 10 + (int)(*p - '0');
if (dot > 0) ++dot;
} else if (*p == '.') {
if (dot > 0) { return DOUBLE_DOT; }
dot = 1;
} else { return PARSE_ERROR; }
if (overflow_check > ival) { return INTEGER_OVERFLOW; }
}
*x = ival;
if (dot == 0) *x *= 100.0;
else if (dot == 1) *x *= 100.0;
else if (dot == 2) *x *= 10.0;
else if (dot > 3) { return TOO_MANY_DIGITS_AFTER_DECIMAL_POINT; }
*x /= 100.0;
return SUCCESS;
}
请参阅gist了解有效的测试代码。
答案 2 :(得分:1)
UPDATE#2在字符数组外写入。 - &GT; UB
假设sizeof(int)== 4
或8
。
// buf1[14] or buf1[26]
char buf1[sizeof(int)*3+2]="";
// the string length of buf1 is at least 8 and likely 10+
snprintf(buf1, sizeof buf1, "%f", balance1);
char sbal[20]="";
strcat(sbal,"STB Balance: "); // 14 char used
// attempts to write at least 14+8 = 22 char, sbal too small.
strcat(sbal,buf1);
也许OP想要
#include <float.h>
// - Digits in FLT_MAX .xx \0
#define FLT_SIZE_2_DP (1 + (FLT_MAX_10_EXP + 1) + (1 + 2) + 1
char sbal[sizeof("STB Balance: ") + FLT_SIZE_2_DP];
int len = snprintf(sbal, sizeof sbal, "STB Balance: %.2f", balance1);
if (len >= 0 && len < sizeof sbal) {
prn_write_text(sbal,strlen(sbal),1);
else {
prn_write_text("Error",5,1);
}
将包含负小数的字符数组转换为只包含2位小数的浮点值的正确方法是什么?
当代码具有特殊输入要求时,有助于创建帮助函数以满足需要。下面读取2个整数,然后将它们组合成float
。
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
// EOF: end-of-file or IO error
// 0: no conversion
// 1: success
int read_float_2dp(FILE *istream, float *f) {
intmax_t ipart;
char fpart_str[3];
int count = fscanf(istream, "%jd.%2[0-9]", &ipart, fpart_str);
if (count <= 0) return count;
int fpart = (count == 2) ? atoi(fpart_str) : 0;
if (ipart < 0) fpart = -fpart;
*f = ipart + fpart / 100.0f;
return 1;
}
答案 3 :(得分:0)
char pkgamount[10],pkgamount1[10];
char something[][3] = {"1.3","53","123","569"};
int amt2;
float amt1;
sscanf(pkgamount,"%2d",&amt2);
sscanf(pkgamount1,"%2.2f",&am1);
%2d只会扫描到十进制值,与小数点前的浮点数2和后面的2相同...现在问题是我不确切知道你期待什么,这就是我定义的东西[] [ 3] 2D数组,导致yu如何存储值,这意味着什么[0] [3]某事[1] [3]某事[2] [3]等等,在内存意味着数组内容0到位持有3个字符,在地方1可以容纳3个......现在它的yto yu如何使用循环来获取值...我可以给你一个例子..
char something[10][3];
int i;
for (1..10)
{
scanf("%2s",&something[i]);
}
printf("\nSomething array");
for (i..10)
{
printf("\n%2s",something[i]);
}