1/*
2 * Copyright 2012-2024, Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6#include "StringForRate.h"
7
8#include <stdio.h>
9
10#include <Catalog.h>
11#include <NumberFormat.h>
12#include <StringFormat.h>
13#include <SystemCatalog.h>
14
15
16using BPrivate::gSystemCatalog;
17
18
19#undef B_TRANSLATION_CONTEXT
20#define B_TRANSLATION_CONTEXT "StringForRate"
21
22
23namespace BPrivate {
24
25
26const char*
27string_for_rate(double rate, char* string, size_t stringSize)
28{
29	BString printedRate;
30
31	double value = rate / 1024.0;
32	if (value < 1.0) {
33		BStringFormat format(
34			B_TRANSLATE_MARK_ALL("{0, plural, one{# byte/s} other{# bytes/s}}",
35			B_TRANSLATION_CONTEXT, "bytes per second"));
36
37		format.Format(printedRate, (int)rate);
38		strlcpy(string, gSystemCatalog.GetString(printedRate.String(), B_TRANSLATION_CONTEXT,
39			"bytes per second"), stringSize);
40
41		return string;
42	}
43
44	const char* kFormats[] = {
45		B_TRANSLATE_MARK_ALL("%s KiB/s", B_TRANSLATION_CONTEXT, "units per second"),
46		B_TRANSLATE_MARK_ALL("%s MiB/s", B_TRANSLATION_CONTEXT, "units per second"),
47		B_TRANSLATE_MARK_ALL("%s GiB/s", B_TRANSLATION_CONTEXT, "units per second"),
48		B_TRANSLATE_MARK_ALL("%s TiB/s", B_TRANSLATION_CONTEXT, "units per second")
49	};
50
51	size_t index = 0;
52	while (index < B_COUNT_OF(kFormats) && value >= 1024.0) {
53		value /= 1024.0;
54		index++;
55	}
56
57	BNumberFormat numberFormat;
58	numberFormat.SetPrecision(2);
59	numberFormat.Format(printedRate, value);
60	snprintf(string, stringSize, gSystemCatalog.GetString(kFormats[index], B_TRANSLATION_CONTEXT,
61		"units per second"), printedRate.String());
62
63	return string;
64}
65
66
67}	// namespace BPrivate
68
69