@@ -480,6 +480,26 @@ def unicode_table(
480480 return "" .join (out )
481481
482482
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+
483503def html_table (rows , * , header ):
484504 headers = "" .join (f"<th>{ h } </th>" for h in header )
485505 rows = (
@@ -519,7 +539,7 @@ def tree_sequence_html(ts):
519539 f"""
520540 <tr>
521541 <td>{ name .capitalize ()} </td>
522- <td>{ table .num_rows :, } </td>
542+ <td>{ format_number ( table .num_rows ) } </td>
523543 <td>{ naturalsize (table .nbytes )} </td>
524544 <td style="text-align: center;">
525545 { '✅' if hasattr (table , "metadata" ) and len (table .metadata ) > 0
@@ -599,10 +619,10 @@ def tree_sequence_html(ts):
599619 </tr>
600620 </thead>
601621 <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>
604624 <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>
606626 <tr><td>Total Size</td><td>{ naturalsize (ts .nbytes )} </td></tr>
607627 <tr>
608628 <td>Metadata</td><td style="text-align: left;">{ md } </td>
@@ -671,13 +691,13 @@ def tree_html(tree):
671691 </tr>
672692 </thead>
673693 <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>
681701 </tbody>
682702 </table>
683703 </div>
@@ -746,18 +766,18 @@ def variant_html(variant):
746766 return (
747767 html_body_head
748768 + 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>
753773 """
754774 + "\n " .join (
755775 [
756776 f"""<tr><td>Samples with Allele { 'missing' if k is None
757777 else "'" + k + "'" } </td><td>"""
758- + f"{ counts [k ]:, } "
778+ + f"{ format_number ( counts [k ]) } "
759779 + " "
760- + f"({ freqs [k ] * 100 :,.2g } %)"
780+ + f"({ format_number ( freqs [k ] * 100 , 2 ) } %)"
761781 + "</td></tr>"
762782 for k in variant .alleles
763783 ]
0 commit comments