예제 #1
0
std::string to_string(int64_t value, const FormatSpec& fmt) {
	std::ostringstream ss;
	PrintfSpec spec;

	if (! fmt.empty()) {
		if (fmt.specifierIs("d") || fmt.specifierIs("i")) {
			ss.setf(std::ios::dec, std::ios::basefield);
		} else
			return std::string("%(err: bad format)");

		const char *fmtbegin, *fmtend;
		fmt.paramPtr(0, fmtbegin, fmtend);
		if (fmtend != fmtbegin)
			parse_printfspec(spec, fmtbegin, fmtend);
	}

	// sign padding is not supported
	if (spec.flags & PrintfSpec::PadSign)
		return std::string("%(err: bad format)");

	// precision is ignore for integer arguments
	if (spec.precision != -1)
		return std::string("%(err: bad format)");

	init_iosflags(ss, spec);

	ss << value;
	return ss.str();
}
예제 #2
0
std::string to_string(double value, const FormatSpec& fmt) {
	std::ostringstream ss;
	PrintfSpec spec;

	if (! fmt.empty()) {
		if (fmt.specifierIs("f")) {
			ss.setf(std::ios::fixed, std::ios::floatfield);
		} else if (fmt.specifierIs("g")) {
		} else if (fmt.specifierIs("G")) {
			ss.setf(std::ios::uppercase);
		} else if (fmt.specifierIs("e")) {
			ss.setf(std::ios::scientific, std::ios::floatfield);
		} else if (fmt.specifierIs("E")) {
			ss.setf(std::ios::scientific, std::ios::floatfield);
			ss.setf(std::ios::uppercase);
		} else
			return std::string("%(err: bad format)");

		const char *fmtbegin, *fmtend;
		fmt.paramPtr(0, fmtbegin, fmtend);
		if (fmtend != fmtbegin)
			parse_printfspec(spec, fmtbegin, fmtend);
	}

	// sign padding is not supported
	if (spec.flags & PrintfSpec::PadSign)
		return std::string("%(err: bad format)");

	init_iosflags(ss, spec);

	ss << value;
	return ss.str();
}