شكل سلسلة مع٪ غرام في C
سؤال
وكيف أقوم بإنشاء سلسلة بحيث تنسيقات أرقام النقطة العائمة لديهم أي نقطة أو الأرقام العشرية زائدة عندما يكون عدد صحيح، ولكن لعدم التبديل إلى العلمي لأعداد أكبر؟
وعندما أفعل:
float myFloat= 15.6f;
float myInt = 5.0f;
float myLarge = 7000000.0f;
sprintf(out, "my float is %g", myFloat);
sprintf(out, "my int is %g", myInt);
sprintf(out, "my large is %g", myLarge);
وأحصل على شيء من هذا القبيل:
my float is 15.6 my int is 5 my large is 7e+07f
وأريد كل سلسلة تنسيق واحدة من شأنها أن تعطي 15.6 و 5 و 700000.
السبب قام تعليقات لا تفعل التنسيق: م>
وهذا ما ظننت. ولكن المجمع هو مريح جدا كما لو هي جزء لا يتجزأ من سلاسل التنسيق في سلاسل التنسيق أطول:
sprintf(buf, "%d %g", myInt, myFloat);
وكيف التفاف ذلك؟
sprintf(buf, "%d %g", myInt, Wrapper(myFloat));??
وماذا يجب أن التفاف العودة؟ أو ما هو أسوأ:
sprintf(buf, "%d %s", myInt, Wrapper(myFloat));??
المحلول
وأنا لا أعتقد أنه يمكنك الحصول على هذه مع %g
، كما %g
يعطيك أقصر من %e
أو %f
.
وهكذا، وأنا لا أعتقد أن هناك حجة printf
واحدة ترضي لك. 15.6، يمكنك استخدام %2.1f
. لل7000000، يمكنك استخدام %7.0f
.
وأفضل رهان هو على الارجح لكتابة الدالة المجمع التي من شأنها أن ننظر إلى حجم القيمة الخاصة بك وتطبيق حجة printf
الصحيحة.
نصائح أخرى
ويمكنك تنسيق مع "٪. * و"، والذي يسمح لك لتمرير الدقة كمعلمة منفصلة على سبيل المثال sprintf. لقد استعملت هذا في الماضي عندما كنت أرغب في عرض 0، 1، 2، أو ربما 3 أرقام لطيف دون اضافية زائدة 0 في. كتابة دالة المساعد القليل الذي يأخذ مزدوج / تعويم وإرجاع الدقة عدد صحيح (بضرب بحلول عام 1000 ومن ثم القيام مودولو 10، 100، 1000). ثم استدعاء sprintf مع "٪. * و" استدعاء الدالة المساعد، وتمرير تعويم.
ونهج مايك هو معقول، ولكن يمكنك حساب عدد الأرقام مباشرة باستخدام وظيفة LOG10، واستخدام إما الأرض أو سقف للتحقق من أنك في الواقع لديها قيمة عددية. شيء من هذا القبيل:
#include <math.h>
double x;
...
if (floor(x) == x && x != 0.0) { // x is an non-zero integer value
int digits = floor(log10(fabs(x)+0.5)) + 1;
printf("x is %.*f\n", digits, x);
}
وتفريغ تلك السلسلة من المكالمات وظيفة، علينا أولا أخذ القيمة المطلقة للتأكد من أن الحجة غير السلبية، إضافة 0.5 إلى قيمة عدد صحيح معروف لرعاية أي أخطاء roundoff الممكنة في مجال الحوسبة LOG10 من قوة على وجه الدقة من 10 ، والجمع بين LOG10 والأرضية للحصول على الأس من أكبر قوة 10 أقل من المصنوعة (خ) +0.5، وأخيرا إضافة 1 للحصول على عدد من الأرقام المطلوبة لتمثيل س. وفيما يلي بعض القيم العينة (من أوبن أوفيس، ولكن وظيفة C LOG10 يجب حساب في الدقة مماثلة):
x log10(x+0.5)
1 0.176091259055681000
9 0.977723605288848000
10 1.021189299069940000
99 1.997823080745730000
100 2.002166061756510000
999 2.999782798454140000
1000 3.000217092972230000
10000 4.000021714181250000
100000 5.000002171466980000
1000000 6.000000217147190000
10000000 7.000000021714720000
100000000 8.000000002171470000
1000000000 9.000000000217150000
واستبدال٪ ز مع٪ .10g لإظهار ما يصل إلى 10 أرقام كبيرة