Skip to content

Commit ba9857a

Browse files
authored
fix(js/ts): hex format specifier uses no padding unless precision is specified (#4603)
1 parent 7a9a3ea commit ba9857a

2 files changed

Lines changed: 84 additions & 1 deletion

File tree

src/fable-library-ts/String.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ export function format(str: string | object, ...args: any[]) {
421421
if (!isIntegral(rep)) {
422422
throw new Exception("Format specifier was invalid.");
423423
}
424-
precision = precision != null ? precision : 2;
424+
precision = precision != null ? precision : 1;
425425
rep = padLeft(toHex(rep), precision, "0");
426426
if (format === "X") {
427427
rep = rep.toUpperCase();

tests/Js/Main/StringTests.fs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,89 @@ let tests = testList "Strings" [
511511
String.Format(CultureInfo.InvariantCulture, "{0:P2}", 0.1234) |> equal "12.34 %"
512512
String.Format(CultureInfo.InvariantCulture, "{0:C2}", 1000) |> equal "¤1,000.00"
513513
514+
testCase "x and X format specifiers work with no defined precision" <| fun () ->
515+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 0) |> equal "0"
516+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 0u) |> equal "0"
517+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 0l) |> equal "0"
518+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 0UL) |> equal "0"
519+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 0L) |> equal "0"
520+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 1) |> equal "1"
521+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 1u) |> equal "1"
522+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 1l) |> equal "1"
523+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 1UL) |> equal "1"
524+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 1L) |> equal "1"
525+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 8) |> equal "8"
526+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 8u) |> equal "8"
527+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 8l) |> equal "8"
528+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 8UL) |> equal "8"
529+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 8L) |> equal "8"
530+
String.Format(CultureInfo.InvariantCulture, "{0:x}", 15) |> equal "f"
531+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 15) |> equal "F"
532+
String.Format(CultureInfo.InvariantCulture, "{0:x}", 15u) |> equal "f"
533+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 15u) |> equal "F"
534+
String.Format(CultureInfo.InvariantCulture, "{0:x}", 15l) |> equal "f"
535+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 15l) |> equal "F"
536+
String.Format(CultureInfo.InvariantCulture, "{0:x}", 15UL) |> equal "f"
537+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 15UL) |> equal "F"
538+
String.Format(CultureInfo.InvariantCulture, "{0:x}", 15L) |> equal "f"
539+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 15L) |> equal "F"
540+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 16) |> equal "10"
541+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 16u) |> equal "10"
542+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 16l) |> equal "10"
543+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 16UL) |> equal "10"
544+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 16L) |> equal "10"
545+
String.Format(CultureInfo.InvariantCulture, "{0:x}", 26) |> equal "1a"
546+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 26) |> equal "1A"
547+
String.Format(CultureInfo.InvariantCulture, "{0:x}", 26u) |> equal "1a"
548+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 26u) |> equal "1A"
549+
String.Format(CultureInfo.InvariantCulture, "{0:x}", 26l) |> equal "1a"
550+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 26l) |> equal "1A"
551+
String.Format(CultureInfo.InvariantCulture, "{0:x}", 26UL) |> equal "1a"
552+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 26UL) |> equal "1A"
553+
String.Format(CultureInfo.InvariantCulture, "{0:x}", 26L) |> equal "1a"
554+
String.Format(CultureInfo.InvariantCulture, "{0:X}", 26L) |> equal "1A"
555+
556+
(0).ToString("X") |> equal "0"
557+
(0u).ToString("X") |> equal "0"
558+
(0l).ToString("X") |> equal "0"
559+
(0UL).ToString("X") |> equal "0"
560+
(0L).ToString("X") |> equal "0"
561+
(1).ToString("X") |> equal "1"
562+
(1u).ToString("X") |> equal "1"
563+
(1l).ToString("X") |> equal "1"
564+
(1UL).ToString("X") |> equal "1"
565+
(1L).ToString("X") |> equal "1"
566+
(8).ToString("X") |> equal "8"
567+
(8u).ToString("X") |> equal "8"
568+
(8l).ToString("X") |> equal "8"
569+
(8UL).ToString("X") |> equal "8"
570+
(8L).ToString("X") |> equal "8"
571+
(15).ToString("x") |> equal "f"
572+
(15).ToString("X") |> equal "F"
573+
(15u).ToString("x") |> equal "f"
574+
(15u).ToString("X") |> equal "F"
575+
(15l).ToString("x") |> equal "f"
576+
(15l).ToString("X") |> equal "F"
577+
(15UL).ToString("x") |> equal "f"
578+
(15UL).ToString("X") |> equal "F"
579+
(15L).ToString("x") |> equal "f"
580+
(15L).ToString("X") |> equal "F"
581+
(16).ToString("X") |> equal "10"
582+
(16u).ToString("X") |> equal "10"
583+
(16l).ToString("X") |> equal "10"
584+
(16UL).ToString("X") |> equal "10"
585+
(16L).ToString("X") |> equal "10"
586+
(26).ToString("x") |> equal "1a"
587+
(26).ToString("X") |> equal "1A"
588+
(26u).ToString("x") |> equal "1a"
589+
(26u).ToString("X") |> equal "1A"
590+
(26l).ToString("x") |> equal "1a"
591+
(26l).ToString("X") |> equal "1A"
592+
(26UL).ToString("x") |> equal "1a"
593+
(26UL).ToString("X") |> equal "1A"
594+
(26L).ToString("x") |> equal "1a"
595+
(26L).ToString("X") |> equal "1A"
596+
514597
testCase "ToString formatted works with decimals" <| fun () -> // See #2276
515598
let decimal = 78.6M
516599
decimal.ToString("0.000").Replace(",", ".") |> equal "78.600"

0 commit comments

Comments
 (0)