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