format: support %Id conversion characters in format.js

This is needed for languages which translate numbers with an
alternative representation, such as Persian.

https://bugzilla.gnome.org/show_bug.cgi?id=673106
This commit is contained in:
Cosimo Cecchi 2012-03-29 15:29:48 -04:00
parent 8a11ab7d96
commit 6d82aefad4
3 changed files with 28 additions and 2 deletions

View File

@ -1,5 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Shell = imports.gi.Shell;
/*
* This function is intended to extend the String object and provide
* an String.format API for string formatting.
@ -17,11 +19,16 @@ function format() {
let i = 0;
let args = arguments;
return str.replace(/%([0-9]+)?(?:\.([0-9]+))?(.)/g, function (str, widthGroup, precisionGroup, genericGroup) {
return str.replace(/%(I+)?([0-9]+)?(?:\.([0-9]+))?(.)/g, function (str, flagsGroup, widthGroup, precisionGroup, genericGroup) {
if (precisionGroup != '' && genericGroup != 'f')
throw new Error("Precision can only be specified for 'f'");
let hasAlternativeIntFlag = (flagsGroup.indexOf('I') != -1);
if (hasAlternativeIntFlag && genericGroup != 'd')
throw new Error("Alternative output digits can only be specfied for 'd'");
let fillChar = (widthGroup[0] == '0') ? '0' : ' ';
let width = parseInt(widthGroup, 10) || 0;
@ -41,7 +48,11 @@ function format() {
s = args[i++].toString();
break;
case 'd':
s = parseInt(args[i++]).toString();
let intV = parseInt(args[i++]);
if (hasAlternativeIntFlag)
s = Shell.format_int_alternative_output(intV);
else
s = intV.toString();
break;
case 'x':
s = parseInt(args[i++]).toString(16);

View File

@ -868,3 +868,15 @@ shell_util_wifexited (int status,
return ret;
}
/**
* shell_format_int_alternative_output:
* @intval:
*
* Returns: (transfer full):
*/
gchar *
shell_format_int_alternative_output (gint intval)
{
return g_strdup_printf ("%Id", intval);
}

View File

@ -52,6 +52,9 @@ gboolean shell_session_is_active_for_systemd (void);
gboolean shell_util_wifexited (int status,
int *exit);
gchar *shell_format_int_alternative_output (gint intval);
G_END_DECLS
#endif /* __SHELL_UTIL_H__ */