বায়ু আকারে জাভাস্ক্রিপ্টে কেবি, এমবি, জিবি রূপান্তর করার সঠিক উপায়


258

আমি এই কোডটি পিএইচপি এর মাধ্যমে বাইট আকারে গোপন করতে পেয়েছি ।

এখন আমি জাভাস্ক্রিপ্ট ব্যবহার করে সেই আকারগুলি মানব পাঠযোগ্য আকারে রূপান্তর করতে চাই । আমি এই কোডটিকে জাভাস্ক্রিপ্টে রূপান্তরিত করার চেষ্টা করেছি, যা দেখতে এটির মতো দেখাচ্ছে:

function formatSizeUnits(bytes){
  if      (bytes >= 1073741824) { bytes = (bytes / 1073741824).toFixed(2) + " GB"; }
  else if (bytes >= 1048576)    { bytes = (bytes / 1048576).toFixed(2) + " MB"; }
  else if (bytes >= 1024)       { bytes = (bytes / 1024).toFixed(2) + " KB"; }
  else if (bytes > 1)           { bytes = bytes + " bytes"; }
  else if (bytes == 1)          { bytes = bytes + " byte"; }
  else                          { bytes = "0 bytes"; }
  return bytes;
}

এটি কি এটি করার সঠিক উপায়? কোন সহজ উপায় আছে?


5
এটি আসলে জিআইবি, এমআইবি এবং কিবিতে রূপান্তর করে। এটি ফাইল মাপের জন্য আদর্শ, তবে সর্বদা ডিভাইসের আকারের জন্য নয়।
ডেভিড শোয়ার্টজ

উত্তর:


761

এটি থেকে: ( উত্স )

function bytesToSize(bytes) {
   var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
   if (bytes == 0) return '0 Byte';
   var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
   return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
}

দ্রষ্টব্য: এটি আসল কোড, দয়া করে নীচে স্থিত সংস্করণ ব্যবহার করুন। অ্যালিসেলজম তার অনুলিপি কোডটি আর সক্রিয় করে না


এখন, ফিক্সড সংস্করণ আনমিনাইফড এবং ES6'ed: (সম্প্রদায় দ্বারা)

function formatBytes(bytes, decimals = 2) {
    if (bytes === 0) return '0 Bytes';

    const k = 1024;
    const dm = decimals < 0 ? 0 : decimals;
    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

    const i = Math.floor(Math.log(bytes) / Math.log(k));

    return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
}

এখন, স্থির সংস্করণ: (স্ট্যাকওভারফ্লো সম্প্রদায়ের দ্বারা, + জেএসকম্প্রেস দ্বারা মিনিডযুক্ত )

function formatBytes(a,b=2){if(0===a)return"0 Bytes";const c=0>b?0:b,d=Math.floor(Math.log(a)/Math.log(1024));return parseFloat((a/Math.pow(1024,d)).toFixed(c))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][d]}

ব্যবহার:

// formatBytes(bytes,decimals)

formatBytes(1024);       // 1 KB
formatBytes('1024');     // 1 KB
formatBytes(1234);       // 1.21 KB
formatBytes(1234, 3);    // 1.205 KB

ডেমো / উত্স:

function formatBytes(bytes, decimals = 2) {
    if (bytes === 0) return '0 Bytes';

    const k = 1024;
    const dm = decimals < 0 ? 0 : decimals;
    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

    const i = Math.floor(Math.log(bytes) / Math.log(k));

    return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
}

// ** Demo code **
var p = document.querySelector('p'),
    input = document.querySelector('input');
    
function setText(v){
    p.innerHTML = formatBytes(v);
}
// bind 'input' event
input.addEventListener('input', function(){ 
    setText( this.value )
})
// set initial text
setText(input.value);
<input type="text" value="1000">
<p></p>

PS: পরিবর্তন করুন k = 1000বা sizes = ["..."]আপনি যেমন চান ( বিট বা বাইট )


8
(1) বাইটস = 0 "এন / এ" কেন? এটি কি শুধু "0 বি" নয়? (২) ম্যাথ.উন্ডের যথার্থ প্যারামিটার নেই। আমি আরও ভাল ব্যবহার করতে চাই(bytes / Math.pow(1024, i)).toPrecision(3)
21:13

4
toFixed(n)toPrecision(n)সমস্ত মানগুলির জন্য একটি সংক্ষিপ্ত নির্ভুলতার চেয়ে সম্ভবত আরও উপযুক্ত । এবং পিছনের জিরোগুলি এড়াতে (প্রাক্তন bytesToSize(1000) // return "1.00 KB":) আমরা ব্যবহার করতে পারি parseFloat(x)। আমি শেষ লাইনটি প্রতিস্থাপন করতে সুপারিশ: return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];। পূর্ববর্তী পরিবর্তনের সাথে ফলাফলগুলি bytesToSize(1000) // return "1 KB"bytesToSize(1100) // return "1.1 KB"bytesToSize(1110) // return "1.11 KBbytesToSize(1111) // also return "1.11 KB"
হ'ল

3
আমি বিশ্বাস করি 0: '0 বাইটস'
নিমা

14
আমি বলবো মিনিফাইটি দুর্দান্ত, তবে স্ট্যাকেক্সচেঞ্জের উত্তরে আরও বেশি ভার্বোস এবং পঠনযোগ্য কোড থাকা ভাল।
ডোনকিক্সোট

2
কেবি = এস এস ইউনিটগুলিতে কেলভিন বাইটস। যা অযৌক্তিক। এটি কেবি হওয়া উচিত।
ব্রেনান টি

47
function formatBytes(bytes) {
    var marker = 1024; // Change to 1000 if required
    var decimal = 3; // Change as required
    var kiloBytes = marker; // One Kilobyte is 1024 bytes
    var megaBytes = marker * marker; // One MB is 1024 KB
    var gigaBytes = marker * marker * marker; // One GB is 1024 MB
    var teraBytes = marker * marker * marker * marker; // One TB is 1024 GB

    // return bytes if less than a KB
    if(bytes < kiloBytes) return bytes + " Bytes";
    // return KB if less than a MB
    else if(bytes < megaBytes) return(bytes / kiloBytes).toFixed(decimal) + " KB";
    // return MB if less than a GB
    else if(bytes < gigaBytes) return(bytes / megaBytes).toFixed(decimal) + " MB";
    // return GB if less than a TB
    else return(bytes / gigaBytes).toFixed(decimal) + " GB";
}

34
const units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

function niceBytes(x){

  let l = 0, n = parseInt(x, 10) || 0;

  while(n >= 1024 && ++l){
      n = n/1024;
  }
  //include a decimal point and a tenths-place digit if presenting 
  //less than ten of KB or greater units
  return(n.toFixed(n < 10 && l > 0 ? 1 : 0) + ' ' + units[l]);
}

ফলাফল:

niceBytes(435)                 // 435 bytes
niceBytes(3398)                // 3.3 KB
niceBytes(490398)              // 479 KB
niceBytes(6544528)             // 6.2 MB
niceBytes(23483023)            // 22 MB
niceBytes(3984578493)          // 3.7 GB
niceBytes(30498505889)         // 28 GB
niceBytes(9485039485039445)    // 8.4 PB

15

আপনি ফাইল আকারের লাইব্রেরি ব্যবহার করতে পারেন ।


আমার ধারণা এই লাইব্রেরিটি সঠিক প্রতিনিধিত্ব দেয়, যেহেতু 1024 বাইট 1 কেবি, 1000 বাইট নয় (এখানে কিছু অন্যান্য সমাধান দ্বারা সরবরাহ করা হয়েছে)। ধন্যবাদ @ মমরোচি
ডাব্লুএম

3
@WM- এর উক্তিটি সত্য নয়। 1 কেবি = 1000 বাইট। একটি কিবিবাইটে 1024 বাইট রয়েছে। অতীতেও বিভ্রান্তি দেখা দিয়েছে তাই এই দুটি পদটি আকারের পার্থক্যটি স্পষ্টভাবে ব্যাখ্যা করে।
ব্রেনান টি

2
@ ব্রেনান্ট এটি আপনার বয়স কত নির্ভর করে। 1 কেবি 1024 বাইট ব্যবহার করত এবং নির্দিষ্ট বয়সের বেশিরভাগ লোকেরা এখনও এটিকে দেখতে পান।
kojow7

14

বাইটের সাথে সম্পর্কিত হলে মাপগুলি উপস্থাপনের জন্য দুটি আসল উপায় রয়েছে, সেগুলি হ'ল এসআই ইউনিট (10 ^ 3) বা আইইসি ইউনিট (2 ^ 10)। জেইডিসিও রয়েছে তবে তাদের পদ্ধতিটি দ্ব্যর্থক এবং বিভ্রান্তিকর। আমি লক্ষ করেছি যে অন্যান্য উদাহরণগুলিতে কিলোবাইট উপস্থাপনের জন্য কেবি পরিবর্তে কেবি ব্যবহার করার মতো ত্রুটি রয়েছে তাই আমি একটি ফাংশন লেখার সিদ্ধান্ত নিয়েছি যা বর্তমানে পরিমাপের স্বীকৃত ইউনিটের পরিসর ব্যবহার করে এই প্রতিটি ক্ষেত্রে সমাধান করবে।

শেষে একটি ফর্ম্যাটিং বিট রয়েছে যা নম্বরটি কিছুটা আরও ভাল দেখায় (কমপক্ষে আমার চোখের কাছে) যদি আপনার উদ্দেশ্য অনুযায়ী না আসে তবে এই বিন্যাসটি সরাতে দ্বিধা বোধ করবে।

উপভোগ করুন।

// pBytes: the size in bytes to be converted.
// pUnits: 'si'|'iec' si units means the order of magnitude is 10^3, iec uses 2^10

function prettyNumber(pBytes, pUnits) {
    // Handle some special cases
    if(pBytes == 0) return '0 Bytes';
    if(pBytes == 1) return '1 Byte';
    if(pBytes == -1) return '-1 Byte';

    var bytes = Math.abs(pBytes)
    if(pUnits && pUnits.toLowerCase() && pUnits.toLowerCase() == 'si') {
        // SI units use the Metric representation based on 10^3 as a order of magnitude
        var orderOfMagnitude = Math.pow(10, 3);
        var abbreviations = ['Bytes', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
    } else {
        // IEC units use 2^10 as an order of magnitude
        var orderOfMagnitude = Math.pow(2, 10);
        var abbreviations = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
    }
    var i = Math.floor(Math.log(bytes) / Math.log(orderOfMagnitude));
    var result = (bytes / Math.pow(orderOfMagnitude, i));

    // This will get the sign right
    if(pBytes < 0) {
        result *= -1;
    }

    // This bit here is purely for show. it drops the percision on numbers greater than 100 before the units.
    // it also always shows the full number of bytes if bytes is the unit.
    if(result >= 99.995 || i==0) {
        return result.toFixed(0) + ' ' + abbreviations[i];
    } else {
        return result.toFixed(2) + ' ' + abbreviations[i];
    }
}

13

এখানে একটি ওলাইনার রয়েছে:

val => ['Bytes','Kb','Mb','Gb','Tb'][Math.floor(Math.log2(val)/10)]

অথবা এমনকি:

val => 'BKMGT'[~~(Math.log2(val)/10)]


ভাল !, তবে 1k যদি 1024 নয় 1000?
l2aelba

2
এই হিসাব করা হয় 1k যেমন 2 ^ 10, যেমন 2 ^ 20 এবং তাই 1 মি চিকিত্সা। আপনি যদি 1 কে 1000 হতে চান তবে আপনি লগ 10 ব্যবহার করতে কিছুটা পরিবর্তন করতে পারেন।
iDaN5x

1
এখানে এমন এক সংস্করণ যা 1 কে 1000 হিসাবে গণ্য করে:val => 'BKMGT'[~~(Math.log10(val)/3)]
iDaN5x

1
এটা সুন্দর! আমার ফাংশনটি থেকে আমি যে স্ট্রিং চেয়েছিলাম তা পুরোপুরি ফিরিয়ে আনতে আমি i = ~~(Math.log2(b)/10); return (b/Math.pow(1024,i)).toFixed(2) + ("KMGTPEZY"[i-1]||"") + "B"
এটির

4

বিটওয়াইজ অপারেশন ব্যবহার করা আরও ভাল সমাধান হবে। এটা চেষ্টা কর

function formatSizeUnits(bytes)
{
    if ( ( bytes >> 30 ) & 0x3FF )
        bytes = ( bytes >>> 30 ) + '.' + ( bytes & (3*0x3FF )) + 'GB' ;
    else if ( ( bytes >> 20 ) & 0x3FF )
        bytes = ( bytes >>> 20 ) + '.' + ( bytes & (2*0x3FF ) ) + 'MB' ;
    else if ( ( bytes >> 10 ) & 0x3FF )
        bytes = ( bytes >>> 10 ) + '.' + ( bytes & (0x3FF ) ) + 'KB' ;
    else if ( ( bytes >> 1 ) & 0x3FF )
        bytes = ( bytes >>> 1 ) + 'Bytes' ;
    else
        bytes = bytes + 'Byte' ;
    return bytes ;
}

1
বাকি বাইটগুলি প্রাপ্ত করুন। এটি দশমিক অংশ সরবরাহ করবে।
বাজ লিগইয়ার এয়ার

1
এটি 1024. আপনার যদি প্রয়োজন হয় সেই অনুযায়ী বিটগুলি 100 শিফট করুন।
বাজ লিগিয়িয়ার


3
ইন্টারনেট না বুঝে বা কমপক্ষে এটি পরীক্ষা না করে কোডটি গ্রহণ করবেন না। এটি কোডের একটি ভাল উদাহরণ যা কেবল ভুল। এটা 3 (রিটার্ন "1Bytes") ক্ষণস্থায়ী বা 400000. দ্বারা এটি চালনার চেষ্টা
আমির Haghighat

10
প্রিয় আমির হাফিঘাট, এটি আমার দ্বারা রচিত একটি প্রাথমিক কোড। জাভাস্রিপ পোস্টে পূর্ণসংখ্যার 32 বিটের কোডটি কোডটি কাজ করবে না কারণ পূর্ণসংখ্যা কেবল চার বাইট হয়। এগুলি হল বেসিক প্রোগ্রামিং ইনফস যা আপনার জানা উচিত। স্ট্যাকওভারফ্লো কেবল মানুষকে গাইড করার জন্য এবং চামচ খাওয়ানোর জন্য নয়।
বাজ লিগটিয়ার

4

অ্যালিসেলজমের উত্তর অনুসারে , আমি দশমিকের পরে 0 অপসারণ করেছি:

function formatBytes(bytes, decimals) {
    if(bytes== 0)
    {
        return "0 Byte";
    }
    var k = 1024; //Or 1 kilo = 1000
    var sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB"];
    var i = Math.floor(Math.log(bytes) / Math.log(k));
    return parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + " " + sizes[i];
}

2

আমি মূলত @ অ্যালেক্সেলজমের উত্তরটি আমি ব্যবহার করছি এমন একটি ফাইল আপলোড প্রকল্পের জন্য ব্যবহার করেছিলাম , তবে সম্প্রতি এমন একটি সমস্যা নিয়ে এসেছি যেখানে কোনও ফাইল রয়েছে 0.98kbতবে এটি পড়ছিল1.02mb । আমি এখন ব্যবহার করছি আপডেট কোড।

function formatBytes(bytes){
  var kb = 1024;
  var ndx = Math.floor( Math.log(bytes) / Math.log(kb) );
  var fileSizeTypes = ["bytes", "kb", "mb", "gb", "tb", "pb", "eb", "zb", "yb"];

  return {
    size: +(bytes / kb / kb).toFixed(2),
    type: fileSizeTypes[ndx]
  };
}

উপরেরগুলি তখন একটি ফাইলের মতো যুক্ত হওয়ার পরে ডাকা হত

// In this case `file.size` equals `26060275` 
formatBytes(file.size);
// returns `{ size: 24.85, type: "mb" }`

মঞ্জুর, উইন্ডোজ ফাইল হিসাবে পড়ে 24.8mbকিন্তু অতিরিক্ত নির্ভুলতার সাথে আমি ভাল আছি।


2

এই সমাধানটি পূর্ববর্তী সমাধানগুলির উপর ভিত্তি করে তৈরি করে তবে মেট্রিক এবং বাইনারি উভয় ইউনিটকে বিবেচনা করে:

function formatBytes(bytes, decimals, binaryUnits) {
    if(bytes == 0) {
        return '0 Bytes';
    }
    var unitMultiple = (binaryUnits) ? 1024 : 1000; 
    var unitNames = (unitMultiple === 1024) ? // 1000 bytes in 1 Kilobyte (KB) or 1024 bytes for the binary version (KiB)
        ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']: 
        ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
    var unitChanges = Math.floor(Math.log(bytes) / Math.log(unitMultiple));
    return parseFloat((bytes / Math.pow(unitMultiple, unitChanges)).toFixed(decimals || 0)) + ' ' + unitNames[unitChanges];
}

উদাহরণ:

formatBytes(293489203947847, 1);    // 293.5 TB
formatBytes(1234, 0);   // 1 KB
formatBytes(4534634523453678343456, 2); // 4.53 ZB
formatBytes(4534634523453678343456, 2, true));  // 3.84 ZiB
formatBytes(4566744, 1);    // 4.6 MB
formatBytes(534, 0);    // 534 Bytes
formatBytes(273403407, 0);  // 273 MB

2

function bytesToSize(bytes) {
  var sizes = ['B', 'K', 'M', 'G', 'T', 'P'];
  for (var i = 0; i < sizes.length; i++) {
    if (bytes <= 1024) {
      return bytes + ' ' + sizes[i];
    } else {
      bytes = parseFloat(bytes / 1024).toFixed(2)
    }
  }
  return bytes + ' P';
}

console.log(bytesToSize(234));
console.log(bytesToSize(2043));
console.log(bytesToSize(20433242));
console.log(bytesToSize(2043324243));
console.log(bytesToSize(2043324268233));
console.log(bytesToSize(2043324268233343));



1

আমি @ অ্যালেক্সেলম উত্তরটি এখানে আপডেট করছি। যেহেতু দশমিক স্থানটি 1,2 ডিজিটের সংখ্যার জন্য গুরুত্বপূর্ণ, আমি প্রথম দশমিক স্থানের বাইরে চলেছি এবং প্রথম দশমিক স্থান রেখেছি। 3 ডিজিটের সংখ্যার জন্য, আমি একক স্থানে চলেছি এবং সমস্ত দশমিক স্থান উপেক্ষা করছি।

getMultiplers : function(bytes){
    var unit = 1000 ;
    if (bytes < unit) return bytes ;
    var exp = Math.floor(Math.log(bytes) / Math.log(unit));
    var pre = "kMGTPE".charAt(exp-1);
    var result = bytes / Math.pow(unit, exp);
    if(result/100 < 1)
        return (Math.round( result * 10 ) / 10) +pre;
    else
        return Math.round(result) + pre;
}

0

এইভাবে একটি বাইট একটি মানুষের দেখানো উচিত:

function bytesToHuman(bytes, decimals = 2) {
  // https://en.wikipedia.org/wiki/Orders_of_magnitude_(data)
  const units = ["bytes", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"]; // etc

  let i = 0;
  let h = 0;

  let c = 1 / 1023; // change it to 1024 and see the diff

  for (; h < c && i < units.length; i++) {
    if ((h = Math.pow(1024, i) / bytes) >= c) {
      break;
    }
  }

  // remove toFixed and let `locale` controls formatting
  return (1 / h).toFixed(decimals).toLocaleString() + " " + units[i];
}

// test
for (let i = 0; i < 9; i++) {
  let val = i * Math.pow(10, i);
  console.log(val.toLocaleString() + " bytes is the same as " + bytesToHuman(val));

}

// let's fool around
console.log(bytesToHuman(1023));
console.log(bytesToHuman(1024));
console.log(bytesToHuman(1025));

0

আমি কেবল আমার ইনপুট ভাগ করতে চেয়েছিলাম। আমার এই সমস্যাটি ছিল তাই আমার সমাধানটি এটি। এটি নিম্ন ইউনিটগুলিকে উচ্চ ইউনিটে রূপান্তরিত করবে এবং বিপরীতে কেবল যুক্তি সরবরাহ করবে toUnitএবংfromUnit

export function fileSizeConverter(size: number, fromUnit: string, toUnit: string ): number | string {
  const units: string[] = ['B', 'KB', 'MB', 'GB', 'TB'];
  const from = units.indexOf(fromUnit.toUpperCase());
  const to = units.indexOf(toUnit.toUpperCase());
  const BASE_SIZE = 1024;
  let result: number | string = 0;

  if (from < 0 || to < 0 ) { return result = 'Error: Incorrect units'; }

  result = from < to ? size / (BASE_SIZE ** to) : size * (BASE_SIZE ** from);

  return result.toFixed(2);
}

আমি থেকে ধারণা পেয়েছেন এখানে


0
function bytes2Size(byteVal){
    var units=["Bytes", "KB", "MB", "GB", "TB"];
    var kounter=0;
    var kb= 1024;
    var div=byteVal/1;
    while(div>=kb){
        kounter++;
        div= div/kb;
    }
    return div.toFixed(1) + " " + units[kounter];
}

এই ফাংশনটি সহজেই বোঝা যায় এবং অনুসরণ করা যায় - আপনি এটিকে যে কোনও ভাষায় প্রয়োগ করতে পারেন। আপনি
কেবি এর

কেবল একটি দ্রুত নোট, বাইনারি উপসর্গের মধ্যে পার্থক্য রয়েছে। কিছু এসআই বেস 10 নিয়ম অনুসরণ করে এবং কিছু বেস 2 অনুসরণ করে You আপনি এখানে আরও পড়তে পারেন । তবে, আপনি যদি কে কে 1024 বলে মনে করেন, বিভাজনের পরিবর্তে, আপনি কেবল শিফট অপারেটরের মতো ব্যবহার করতে পারেন byteVal >> 10। এছাড়াও আপনি ভাল ব্যবহার করেন Math.trunc()পূর্ণসংখ্যার বাস্তব সংখ্যার কাস্ট করার জন্য পরিবর্তে ofdivision 1. দ্বারা
কানিং

দয়া করে কেবল উত্তর হিসাবে কোড পোস্ট করবেন না, তবে আপনার কোডটি কী করে এবং কীভাবে এটি সমস্যার সমস্যার সমাধান করে তার একটি ব্যাখ্যাও সরবরাহ করুন। একটি ব্যাখ্যা সহ উত্তরগুলি সাধারণত উচ্চমানের হয় এবং এগুলি আরও বেশি আকর্ষণ করতে পারে are
মার্ক রোটভিল

-7

এই সহজ workaround চেষ্টা করুন।

var files = $("#file").get(0).files;               
                var size = files[0].size;
                if (size >= 5000000) {
alert("File size is greater than or equal to 5 MB");
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.