wxString DirectoriesPrefs::FormatSize(wxLongLong size) { wxString sizeStr; /* wxLongLong contains no built-in conversion to double */ double dSize = size.GetHi() * pow(2, 32); // 2 ^ 32 dSize += size.GetLo(); if (size == -1L) sizeStr = _("Unable to determine"); else { /* make it look nice, by formatting into k, MB, etc */ if (size < 1024) sizeStr.sprintf("%ld bytes", size.GetLo()); else if (size < 1024 * 1024) { sizeStr.sprintf("%.1f kB", dSize / 1024); } else if (size < 1024 * 1024 * 1024) { sizeStr.sprintf("%.1f MB", dSize / (1024 * 1024)); } else { sizeStr.sprintf("%.1f GB", dSize / (1024 * 1024 * 1024)); } } return sizeStr; }
wxString Internat::FormatSize(wxLongLong size) { /* wxLongLong contains no built-in conversion to double */ double dSize = size.GetHi() * pow(2.0, 32); // 2 ^ 32 dSize += size.GetLo(); return FormatSize(dSize); }
wxString CSizeFormatBase::Format(COptionsBase* pOptions, wxLongLong size, bool add_bytes_suffix, enum CSizeFormatBase::_format format, bool thousands_separator, int num_decimal_places) { wxASSERT(format != formats_count); wxASSERT(size >= 0); if( size < 0 ) { size = 0; } if (format == bytes) { wxString result = FormatNumber(pOptions, size, &thousands_separator); if (!add_bytes_suffix) return result; else { // wxPLURAL has no support for wxLongLong int last; if (size > 1000000000) last = (1000000000 + (size % 1000000000)).GetLo(); else last = size.GetLo(); return wxString::Format(wxPLURAL("%s byte", "%s bytes", last), result); } } wxString places; int divider; if (format == si1000) divider = 1000; else divider = 1024; // Exponent (2^(10p) or 10^(3p) depending on option int p = 0; wxLongLong r = size; int remainder = 0; bool clipped = false; while (r > divider && p < 6) { const wxLongLong rr = r / divider; if (remainder != 0) clipped = true; remainder = (r - rr * divider).GetLo(); r = rr; ++p; } if (!num_decimal_places) { if (remainder != 0 || clipped) ++r; } else if (p) { // Don't add decimal places on exact bytes if (format != si1000) { // Binary, need to convert 1024 into range from 1-1000 if (clipped) { ++remainder; clipped = false; } remainder = (int)ceil((double)remainder * 1000 / 1024); } int max; switch (num_decimal_places) { default: num_decimal_places = 1; // Fall-through case 1: max = 9; divider = 100; break; case 2: max = 99; divider = 10; break; case 3: max = 999; break; } if (num_decimal_places != 3) { if (remainder % divider) clipped = true; remainder /= divider; } if (clipped) remainder++; if (remainder > max) { r++; remainder = 0; } places.Printf(_T("%d"), remainder); const size_t len = places.Len(); for (size_t i = len; i < static_cast<size_t>(num_decimal_places); ++i) places = _T("0") + places; } wxString result = r.ToString(); if (!places.empty()) { const wxString& sep = GetRadixSeparator(); result += sep; result += places; } result += ' '; static wxChar byte_unit = 0; if (!byte_unit) { wxString t = _("B <Unit symbol for bytes. Only translate first letter>"); byte_unit = t[0]; } if (!p) return result + byte_unit; result += prefix[p]; if (format == iec) result += 'i'; result += byte_unit; return result; }