@@ -480,6 +480,26 @@ def unicode_table(
480
480
return "" .join (out )
481
481
482
482
483
+ def format_number (number , sig_digits = 8 , sep = "\u2009 " ):
484
+ """
485
+ Format a number with with a separator to indicate thousands
486
+ and up to `sig_digits` significant digits using 'g' format.
487
+
488
+ number: int, float, or a numeric string.
489
+ sig_digits: int, number of significant digits to display.
490
+ sep: str, the separator to use for thousands, default is a thin space.
491
+ Returns a string.
492
+ """
493
+ if isinstance (number , str ):
494
+ try :
495
+ number = float (number )
496
+ except ValueError :
497
+ raise TypeError ("The string cannot be converted to a number" )
498
+
499
+ fmt = f",.{ sig_digits } g"
500
+ return format (number , fmt ).replace ("," , sep )
501
+
502
+
483
503
def html_table (rows , * , header ):
484
504
headers = "" .join (f"<th>{ h } </th>" for h in header )
485
505
rows = (
@@ -519,7 +539,7 @@ def tree_sequence_html(ts):
519
539
f"""
520
540
<tr>
521
541
<td>{ name .capitalize ()} </td>
522
- <td>{ table .num_rows :, } </td>
542
+ <td>{ format_number ( table .num_rows ) } </td>
523
543
<td>{ naturalsize (table .nbytes )} </td>
524
544
<td style="text-align: center;">
525
545
{ '✅' if hasattr (table , "metadata" ) and len (table .metadata ) > 0
@@ -599,10 +619,10 @@ def tree_sequence_html(ts):
599
619
</tr>
600
620
</thead>
601
621
<tbody>
602
- <tr><td>Trees</td><td>{ ts .num_trees :, } </td></tr>
603
- <tr><td>Sequence Length</td><td>{ ts .sequence_length :, } </td></tr>
622
+ <tr><td>Trees</td><td>{ format_number ( ts .num_trees ) } </td></tr>
623
+ <tr><td>Sequence Length</td><td>{ format_number ( ts .sequence_length ) } </td></tr>
604
624
<tr><td>Time Units</td><td>{ ts .time_units } </td></tr>
605
- <tr><td>Sample Nodes</td><td>{ ts .num_samples :, } </td></tr>
625
+ <tr><td>Sample Nodes</td><td>{ format_number ( ts .num_samples ) } </td></tr>
606
626
<tr><td>Total Size</td><td>{ naturalsize (ts .nbytes )} </td></tr>
607
627
<tr>
608
628
<td>Metadata</td><td style="text-align: left;">{ md } </td>
@@ -671,13 +691,13 @@ def tree_html(tree):
671
691
</tr>
672
692
</thead>
673
693
<tbody>
674
- <tr><td>Index</td><td>{ tree .index :, } </td></tr>
675
- <tr><td>Interval</td><td>{ tree .interval .left :,.8g } -{ tree .interval .right :,.8g } ({ tree .span :,.8g } )</td></tr>
676
- <tr><td>Roots</td><td>{ tree .num_roots :, } </td></tr>
677
- <tr><td>Nodes</td><td>{ len (tree .preorder ()):, } </td></tr>
678
- <tr><td>Sites</td><td>{ tree .num_sites :, } </td></tr>
679
- <tr><td>Mutations</td><td>{ tree .num_mutations :, } </td></tr>
680
- <tr><td>Total Branch Length</td><td>{ tree .total_branch_length :,.8g } </td></tr>
694
+ <tr><td>Index</td><td>{ format_number ( tree .index ) } </td></tr>
695
+ <tr><td>Interval</td><td>{ format_number ( tree .interval .left ) } -{ format_number ( tree .interval .right ) } ({ format_number ( tree .span ) } )</td></tr>
696
+ <tr><td>Roots</td><td>{ format_number ( tree .num_roots ) } </td></tr>
697
+ <tr><td>Nodes</td><td>{ format_number ( len (tree .preorder ())) } </td></tr>
698
+ <tr><td>Sites</td><td>{ format_number ( tree .num_sites ) } </td></tr>
699
+ <tr><td>Mutations</td><td>{ format_number ( tree .num_mutations ) } </td></tr>
700
+ <tr><td>Total Branch Length</td><td>{ format_number ( tree .total_branch_length ) } </td></tr>
681
701
</tbody>
682
702
</table>
683
703
</div>
@@ -746,18 +766,18 @@ def variant_html(variant):
746
766
return (
747
767
html_body_head
748
768
+ f"""
749
- <tr><td>Site Id</td><td>{ site_id :, } </td></tr>
750
- <tr><td>Site Position</td><td>{ site_position :,.8g } </td></tr>
751
- <tr><td>Number of Samples</td><td>{ num_samples :, } </td></tr>
752
- <tr><td>Number of Alleles</td><td>{ num_alleles :, } </td></tr>
769
+ <tr><td>Site Id</td><td>{ format_number ( site_id ) } </td></tr>
770
+ <tr><td>Site Position</td><td>{ format_number ( site_position ) } </td></tr>
771
+ <tr><td>Number of Samples</td><td>{ format_number ( num_samples ) } </td></tr>
772
+ <tr><td>Number of Alleles</td><td>{ format_number ( num_alleles ) } </td></tr>
753
773
"""
754
774
+ "\n " .join (
755
775
[
756
776
f"""<tr><td>Samples with Allele { 'missing' if k is None
757
777
else "'" + k + "'" } </td><td>"""
758
- + f"{ counts [k ]:, } "
778
+ + f"{ format_number ( counts [k ]) } "
759
779
+ " "
760
- + f"({ freqs [k ] * 100 :,.2g } %)"
780
+ + f"({ format_number ( freqs [k ] * 100 , 2 ) } %)"
761
781
+ "</td></tr>"
762
782
for k in variant .alleles
763
783
]
0 commit comments