void qore_date_private::format(QoreString &str, const char *fmt) const { qore_time_info i; get(i); const char *s = fmt; while (*s) { switch (*s) { case 'Y': if (s[1] != 'Y') { str.concat('Y'); break; } s++; if ((s[1] == 'Y') && (s[2] == 'Y')) { str.sprintf("%04d", i.year); s += 2; } else str.sprintf("%02d", i.year - (i.year / 100) * 100); break; case 'M': if (s[1] == 'M') { str.sprintf("%02d", i.month); s++; break; } if ((s[1] == 'o') && (s[2] == 'n')) { s += 2; if ((s[1] == 't') && (s[2] == 'h')) { s += 2; if (i.month && (i.month <= 12)) str.sprintf("%s", months[(int)i.month - 1].long_name); else str.sprintf("Month%d", i.month - 1); break; } if (i.month && (i.month <= 12)) str.sprintf("%s", months[(int)i.month - 1].abbr); else str.sprintf("M%02d", i.month); break; } if ((s[1] == 'O') && (s[2] == 'N')) { s += 2; if ((s[1] == 'T') && (s[2] == 'H')) { s += 2; if (i.month && (i.month <= 12)) { str.sprintf("%s", months[(int)i.month - 1].upper_long_name); } else str.sprintf("MONTH%d", i.month); break; } if (i.month && (i.month <= 12)) { str.sprintf("%s", months[(int)i.month - 1].upper_abbr); } else str.sprintf("M%02d", i.month); break; } str.sprintf("%d", i.month); break; case 'D': if (s[1] == 'D') { str.sprintf("%02d", i.day); s++; break; } if ((s[1] == 'a') && (s[2] == 'y')) { s += 2; int wday = qore_date_info::getDayOfWeek(i.year, i.month, i.day); str.sprintf("%s", days[wday].long_name); break; } if ((s[1] == 'A') && (s[2] == 'Y')) { s += 2; int wday = qore_date_info::getDayOfWeek(i.year, i.month, i.day); str.sprintf("%s", days[wday].upper_long_name); break; } if ((s[1] == 'y') || (s[1] == 'Y')) { s++; int wday = qore_date_info::getDayOfWeek(i.year, i.month, i.day); str.sprintf("%s", *s == 'Y' ? days[wday].upper_abbr : days[wday].abbr); break; } str.sprintf("%d", i.day); break; case 'H': if (s[1] == 'H') { str.sprintf("%02d", i.hour); s++; } else str.sprintf("%d", i.hour); break; case 'h': if (s[1] == 'h') { str.sprintf("%02d", ampm(i.hour)); s++; } else str.sprintf("%d", ampm(i.hour)); break; case 'P': if (i.hour > 11) str.sprintf("PM"); else str.sprintf("AM"); break; case 'p': if (i.hour > 11) str.sprintf("pm"); else str.sprintf("am"); break; case 'm': if (s[1] == 'm') { str.sprintf("%02d", i.minute); s++; } else if (s[1] == 's') { str.sprintf("%03d", i.us / 1000); s++; } else str.sprintf("%d", i.minute); break; case 'S': if (s[1] == 'S') { str.sprintf("%02d", i.second); s++; } else str.sprintf("%d", i.second); break; case 'u': if (s[1] == 'u') { str.sprintf("%03d", i.us / 1000); s++; } else if (s[1] == 's') { str.sprintf("%06d", i.us); s++; } else str.sprintf("%d", i.us / 1000); break; case 'x': if (s[1] == 'x') { str.sprintf("%06d", i.us); s++; } else str.sprintf("%d", i.us); break; case 'y': str.sprintf("%06d", i.us); str.trim_trailing('0'); break; case 'z': str.sprintf("%s", i.zname); break; // add iso8601 UTC offset case 'Z': concatOffset(i.utcoffset, str); break; default: str.concat(*s); break; } s++; } }
void qore_number_private::getAsString(QoreString& str, bool round) const { // first check for zero if (zero()) { str.concat("0"); return; } mpfr_exp_t exp; char* buf = mpfr_get_str(0, &exp, 10, 0, num, QORE_MPFR_RND); if (!buf) { numError(str); return; } ON_BLOCK_EXIT(mpfr_free_str, buf); //printd(5, "qore_number_private::getAsString(round: %d) this: %p buf: '%s'\n", round, this, buf); // if it's a regular number, then format accordingly if (number()) { int sgn = sign(); qore_size_t len = str.size() + (sgn < 0 ? 1 : 0); //printd(5, "qore_number_private::getAsString() this: %p '%s' exp "QLLD" len: "QLLD"\n", this, buf, exp, len); qore_size_t dp = 0; str.concat(buf); // trim the trailing zeros off the end str.trim_trailing('0'); if (exp <= 0) { exp = -exp; str.insert("0.", len); dp = len + 1; //printd(5, "qore_number_private::getAsString() this: %p str: '%s' exp: "QLLD" dp: "QLLD" len: "QLLD"\n", this, str.getBuffer(), exp, dp, len); if (exp) str.insertch('0', len + 2, exp); } else { // get remaining length of string (how many characters were added) qore_size_t rlen = str.size() - len; //printd(5, "qore_number_private::getAsString() this: %p str: '%s' exp: "QLLD" rlen: "QLLD"\n", this, str.getBuffer(), exp, rlen); // assert that we have added at least 1 character assert(rlen > 0); if ((qore_size_t)exp > rlen) str.insertch('0', str.size(), exp - rlen); else if ((qore_size_t)exp < rlen) { str.insertch('.', len + exp, 1); dp = len + exp; } } // try to do some rounding (noise reduction with binary->decimal conversions) if (dp && round) applyRoundingHeuristic(str, dp, str.size()); } else str.concat(buf); //printd(5, "qore_number_private::getAsString() this: %p returning '%s'\n", this, str.getBuffer()); }